Схват атрибута href элемента A
Попытка найти ссылки на странице.
мое регулярное выражение:
/<a\s[^>]*href=(\"\'??)([^\"\' >]*?)[^>]*>(.*)<\/a>/
но, похоже, не работает
<a title="this" href="that">what?</a>
Как мне изменить мое регулярное выражение, чтобы иметь дело с href, не помещенным сначала в тег?
Ответы
Ответ 1
Надежное Regex для HTML сложно. Вот как это сделать: DOM:
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
В приведенном выше примере мы найдем "outerHTML" всех A
элементов в строке $html
.
Чтобы получить все текстовые значения node, вы
echo $node->nodeValue;
Чтобы проверить, если существует атрибут href
, вы можете сделать
echo $node->hasAttribute( 'href' );
Чтобы получить атрибут href
, который вы выполнили бы
echo $node->getAttribute( 'href' );
Чтобы изменить атрибут href
, который вы выполнили бы
$node->setAttribute('href', 'something else');
Чтобы удалить атрибут href
, который вы сделали бы
$node->removeAttribute('href');
Вы также можете запросить атрибут href
непосредственно с помощью XPath
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a/@href');
foreach($nodes as $href) {
echo $href->nodeValue; // echo current attribute value
$href->nodeValue = 'new value'; // set new attribute value
$href->parentNode->removeAttribute('href'); // remove attribute
}
Также смотрите:
На стороне: я уверен, что это дубликат, и вы можете найти ответ где-то здесь
Ответ 2
Я согласен с Gordon, вы должны использовать парсер HTML для анализа HTML. Но если вы действительно хотите регулярное выражение, вы можете попробовать следующее:
/^<a.*?href=(["\'])(.*?)\1.*$/
Это соответствует <a
в начале строки, за которой следует любое количество любых char (не жадных) .*?
, затем href=
, за которыми следует ссылка, окруженная либо "
, либо '
$str = '<a title="this" href="that">what?</a>';
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m);
var_dump($m);
Вывод:
array(3) {
[0]=>
string(37) "<a title="this" href="that">what?</a>"
[1]=>
string(1) """
[2]=>
string(4) "that"
}
Ответ 3
Образцом, который вы хотите найти, будет шаблон привязки ссылок, например (что-то):
$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";
Ответ 4
почему бы вам просто не соответствовать
"<a.*?href\s*=\s*['"](.*?)['"]"
<?php
$str = '<a title="this" href="that">what?</a>';
$res = array();
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res);
var_dump($res);
?>
затем
$ php test.php
array(2) {
[0]=>
array(1) {
[0]=>
string(27) "<a title="this" href="that""
}
[1]=>
array(1) {
[0]=>
string(4) "that"
}
}
который работает. Я только что удалил первые фиксации захвата.
Ответ 5
Я не уверен, что вы пытаетесь сделать здесь, но если вы пытаетесь проверить ссылку, посмотрите на PHP filter_var()
Если вам действительно нужно использовать регулярное выражение, тогда ознакомьтесь с этим инструментом, это может помочь:
http://regex.larsolavtorvik.com/
Ответ 6
Используя ваше регулярное выражение, я немного изменил его в соответствии с вашими потребностями.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Я лично предлагаю вам использовать HTML Parser
EDIT: проверено
Ответ 7
Для тех, кто еще не получает решения очень легко и быстро, используя SimpleXML
$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>');
echo $a['href']; // will echo www.something.com
Его работа для меня
Ответ 8
Быстрая проверка: <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
кажется, делает трюк, с 1-м совпадением "или", второе значение "href" "это", а третье - "что?".
Причина, по которой я оставил первое совпадение "/", заключается в том, что вы можете использовать его для обратной ссылки позже для закрытия "/", поэтому оно то же самое.
Смотрите живой пример: http://www.rubular.com/r/jsKyK2b6do
Ответ 9
preg_match_all ( "/(] > )(.?)(</a)/", $contents, $impmatches, PREG_SET_ORDER);
Он протестирован и извлекает все теги из любого html-кода.
Ответ 10
Следующее работает для меня и возвращает href
и value
тега привязки.
preg_match_all("'\<a.*?href=\"(.*?)\".*?\>(.*?)\<\/a\>'si", $html, $match);
if($match) {
foreach($match[0] as $k => $e) {
$urls[] = array(
'anchor' => $e,
'href' => $match[1][$k],
'value' => $match[2][$k]
);
}
}
Многомерный массив $urls
содержит теперь ассоциативные подмассивы, которые просты в использовании.