Привязка тегов к обычному тексту внутри содержимого

StackOverflow https://stackoverflow.com/questions/1439751

  •  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();
    ?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top