Я пытаюсь сопоставить теги <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(); ?>