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

PHP, Вопросы и ответы
27 февраля 2012

Вопрос

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

/<a\s[^>]*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');  // удаляем атрибут
}

11 комментария

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


(обязательно)