Не вытаскивает ссылки
$html = '<a href="/111/" class="elt zi2" title="Ston" target="_blank">Star</a>
текст
<a href="/3233/" class="elt zi2" title="Ston" target="_blank">Star</a>';
preg_replace_callback('#<a\s.*/a>#usi', function (array $matches) {
preg_match_all('/<a.*?href=["\'](.*?)["\'].*?>/i', $matches[0], $url);
print_r($url[1][0]);
print_r('<br>');
}, $html);
Не понимаю, почему достает, обрабатывает только первую ссыклу, второй нету.
Как можно заменить html ссылку на содержимое атрибута href
($dom = new DOMDocument)->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $i => $el){
$href = $el->getAttribute('href');
$lintext = $el->nodeValue;
print_r($el);
}
Ответы (1 шт):
Вам верно указали на то, что парсинг HTML регулярными выражениями -- занятие неблагодарное. Дело в том, что HTML довольно сложен и вы не всегда можете написать правильную регулярку. Например, в документе могут быть якоря типа <a name="top"></a>, кавычки атрибутов могут отсутствовать <a href=https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(unquoted)-state>parsing</a>. Чтобы не ошибиться, лучше воспользоваться готовым, протестированным на таких случаях парсером.
Но для общего развития обратите внимание на так называемую жадность квантификаторов (поищите "жадность" на странице). Ваш шаблон <a\s.*/a> захватывает не первую ссылку, а весь html целиком.
Теперь по поводу замены элемента в DOMDocument. Вы можете собрать все нужные вам элементы ссылок и их href'ы в массив на замену и потом обойти его и воспользоваться методом replaceWith. Обратите внимание, что делать замену надо в отдельном цикле. getElementsByTagName возвращает не массив, а итерируемый объект списка нод, поэтому обход прервётся, если вы будете менять документ во время итерации.
DomDocument интересно работает с кодировкой, поэтому вам возможно придётся повозиться с этим, если в вашем HTML не указана кодировка. Вы можете найти решения погуглив "php dom encoding" или порывшись в комментариях в документации на php.net.