PHP Regex удалить текст из атрибута rel в ссылках - PullRequest
2 голосов
/ 05 марта 2010

Есть ли действительно простой способ получить текст атрибута rel, т.е.

<a href='#' rel='i want this text here'></a>.

Я пробовал сегодня утром с регулярным выражением, но мне не повезло.

Ответы [ 5 ]

4 голосов
/ 05 марта 2010

Не используйте регулярные выражения для нестандартных языков, таких как HTML. Этого можно добиться с помощью XPath. Пример:

$doc = new DOMDocument();
$doc->loadHtml($htmlAsString);
$xpath = new DOMXPath($doc);
$nodelist = $xpath->query('//a[@rel]');
1 голос
/ 05 марта 2010

Если HTML не является на 100% статичным и контролируется вами, я рекомендую вам использовать HTML-анализатор, например, один из встроенных, например DOMDocument или PHP Простой HTML DOM Parser . Это больше усилий для настройки, чем простой Regex, но он будет работать намного надежнее во всех случаях и вариациях.

 <a href='#' rel="i want this text here"></a>
 <a href='#' REL="i want this text here"></a>
 <a rEL='i want this text here' href='#' ></a>
0 голосов
/ 05 марта 2010

Как и другие авторы указали: использование действительно регулярного выражения для разбора html - это действительно плохая идея, так как многие вещи могут пойти не так, и вам потребуется дополнительная поддержка. (Смотрите комментарий Пекки!)

Чтобы добавить некоторое значение, я приведу полный пример получения каждого атрибута rel:

<?php
$html = "<a href='#' rel='i want this text here'></a>";

$dom = new DomDocument();
$dom->loadHtml($html);

$xpath = new DomXPath($dom);
$refAttributes = $xpath->query("//a[@rel]");
// ^^ This means: Get my every <a...></a> that has a rel attribute

foreach($refAttributes as $refAtt) {
    var_dump($refAtt->getAttribute("rel"));
}

А для дополнительного чтения можно попробовать:

http://kore -nordmann.de / блог / do_NOT_parse_using_regexp.html

http://kore -nordmann.de / блог / 0081_parse_html_extract_data_from_html.html

0 голосов
/ 05 марта 2010

Как говорят другие, вы должны избегать использования регулярных выражений для разбора HTML, так как это не регулярно. Но если вы уверены, что в структуре HTML вы можете использовать регулярные выражения. Следующая программа извлечет то, что вам нужно:

<?php
$a = "<a href='#' rel='i want this text here'></a>";

if(preg_match("{<a href.*?rel='(.*?)'.*?>}",$a,$matches)) {
        echo $matches[1]; // prints i want this text here
}
?>
0 голосов
/ 05 марта 2010

Это должно работать:

preg_match_all('%<a[^>]+rel=("([^"]+)"|\'([^\']+)\')[^>]*>%i', $html, $matches);
print_r($matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...