Відповіді:
Надійний Regex для HTML важкий . Ось як це зробити з DOM :
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
Вищезазначене знайде та виведе " зовнішній HTML" всіх A
елементів у $html
рядку.
Щоб отримати всі текстові значення вузла, ви зробите це
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
}
Також дивіться:
З боку: Я впевнений, що це дублікат, і ви можете знайти відповідь десь тут
Я погоджуюся з Гордоном, ви ОБОВ'ЯЗКОВИ використовувати HTML-аналізатор для розбору HTML. Але якщо ви дійсно хочете регулярного вираження, ви можете спробувати цей:
/^<a.*?href=(["\'])(.*?)\1.*$/
Це збігається <a
на початку рядка, за яким слідує будь-яка кількість будь-яких символів (не жадібних), .*?
а 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"
}
Шаблон, який ви хочете шукати, буде схемою прив'язки посилання, наприклад (щось):
$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";
чому ти просто не співпадеш
"<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"
}
}
яка працює. Я щойно зняв перші брекети захоплення.
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
для того, щоб правильно використати всі значення href у використанніforeach($res as $key => $val){echo $val[1]}
Для того, хто досі не отримує рішення дуже легко та швидко за допомогою SimpleXML
$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>');
echo $a['href']; // will echo www.something.com
Це працює для мене
Я не впевнений, що ви намагаєтеся зробити тут, але якщо ви намагаєтесь перевірити посилання, то подивіться на PHP filter_var ()
Якщо вам дійсно потрібно використовувати регулярний вираз, перегляньте цей інструмент, він може допомогти: http://regex.larsolavtorvik.com/
Використовуючи ваш регулярний вираз, я трохи змінив його відповідно до ваших потреб.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Я особисто пропоную вам скористатися HTML-аналізатором
РЕДАКТУВАННЯ: Випробувано
<a title="this" href="that">what?</a>
Швидкий тест: <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
начебто, робиться хитрість: перший матч - це "або", другий - значення "href", що ", а третє -" що? ".
Причиною того, що я залишив перший збіг "/", є те, що ви можете використовувати його, щоб повернути його пізніше для закриття "/", так що це те саме.
Дивіться приклад на веб-сайті : http://www.rubular.com/r/jsKyK2b6do
preg_match_all ("/ (] >) ( ?) (</ a) /", $ content, $ impmatches, PREG_SET_ORDER);
Він тестується, і він отримує весь тег з будь-якого html-коду.
Наступне працює для мене і повертає 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
містить тепер асоціативні підмасиви, які прості у використанні.