Intereting Posts

Якорные теги для обычного текста в содержимом

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

Спасибо, Джейсон

Related of "Якорные теги для обычного текста в содержимом"

Вы можете сделать матч неровным, используя ? , Вы также должны учитывать, что атрибуты 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(); ?>