Привязка тегов к обычному тексту внутри содержимого
-
10-07-2019 - |
Вопрос
Я пытаюсь соответствовать <a>
теги в моем контенте и замените затем текстом ссылки, за которым следует URL в квадратных скобках для печатной версии.Следующий пример работает, если есть только "href".Если в <a>
содержит другой атрибут, он слишком сильно совпадает и не возвращает желаемый результат.Как я могу сопоставить URL-адрес и текст ссылки, и это все?
Вот мой код:
<?php
$content = '<a href="http://www.website.com">This is a text link</a>';
$result = preg_replace('/<a href="(http:\/\/[A-Za-z0-9\\.:\/]{1,})">([\\s\\S]*?)<\/a>/',
'<strong>\\2</strong> [\\1]', $content);
echo $result;
?>
Желаемый результат:
<strong>This is a text link </strong> [http://www.website.com]
Спасибо, Джейсон
Решение
Вы можете сделать матч неприглядным, используя ?
.Вы также должны принять во внимание, что перед href
атрибут.
$result = preg_replace('/<a [^>]*?href="(http:\/\/[A-Za-z0-9\\.:\/]+?)">([\\s\\S]*?)<\/a>/',
'<strong>\\2</strong> [\\1]', $content);
Другие советы
Вы должны использовать DOM для синтаксического анализа HTML, а не регулярных выражений...
Редактировать:Обновленный код для выполнения простого синтаксического анализа регулярных выражений по значению атрибута href.
Правка № 2:Сделал цикл регрессивным, чтобы он мог обрабатывать несколько замен.
$content = '
<p><a href="http://www.website.com">This is a text link</a></p>
<a href="http://sitename.com/#foo">bah</a>
<a href="#foo">I wont change</a>
';
$dom = new DOMDocument();
$dom->loadHTML($content);
$anchors = $dom->getElementsByTagName('a');
$len = $anchors->length;
if ( $len > 0 ) {
$i = $len-1;
while ( $i > -1 ) {
$anchor = $anchors->item( $i );
if ( $anchor->hasAttribute('href') ) {
$href = $anchor->getAttribute('href');
$regex = '/^http/';
if ( !preg_match ( $regex, $href ) ) {
$i--;
continue;
}
$text = $anchor->nodeValue;
$textNode = $dom->createTextNode( $text );
$strong = $dom->createElement('strong');
$strong->appendChild( $textNode );
$anchor->parentNode->replaceChild( $strong, $anchor );
}
$i--;
}
}
echo $dom->saveHTML();
?>