Получить атрибут href ссылки на PHP

Вопрос

Мне надо найти ссылки на странице и получить значение ихнего атрибута href. Я нашёл такое регулярное выражение:

/<as[^>]*href=("\''??)([^"\'' >]*?)[^>]*>(.*)</a>/

Но похоже, что оно не отлавливает ссылки вида:

<a title="this" href="that">Ссылка</a>

Как можно изменить это регулярное выражание, чтобы оно работало в том случае, когда атрибут href не является первым атрибутом тега? Или какие другие способы можно использовать для получения атрибутов HTML-тегов на PHP, кроме регулярок?

Ответ №1

Регулярные выражения для парсинга HTML — не очень удобная штука. Лучше воспользоваться встроенным в PHP объектом DOM, он сделает Ваш код более простым, быстрым и надёжным:

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName(''a'') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}

Этот код выведет HTML-код всех ссылок, которые находятся в переменной $html.
Для работы с атрибутами есть следующие функции.

Проверить, существует ли атрибут href у Вашей ссылки:

if($node->hasAttribute( ''href'' )) {
// ...
}

Вывести значение атрибута href:

echo $node->getAttribute( ''href'' );

Изменить значение атрибута href:

$node->setAttribute(''href'', ''something else'');

Удалить атрибут href:

$node->removeAttribute(''href'');

А ещё можно работать с HTML-атрибутами непосредственно из XPath:

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query(''//a/@href'');
foreach($nodes as $href) {
echo $href->nodeValue;                       // выводим значение атрибута
$href->nodeValue = ''new value'';              // задаём новое значение атрибута
$href->parentNode->removeAttribute(''href'');  // удаляем атрибут
}

No responses yet

Добавить комментарий