2

私の質問はこの質問に似ています:

StackOverflow 自動リンク動作を模倣する方法

ただし、この解決策は、既にリンクが含まれている可能性のある混合コンテンツでは機能しません。既に A タグ内にある URL はすべて、<a href="http://stackoverflow.com">My Link</a>にマングルされています。<a href="<a href="http://stackoverflow.com">stackoverflow.com</a>">My Link</a>

望ましい動作は次のとおりです。

https://stackoverflow.com/ is a wonderful URL.

<a href="https://stackoverflow.com/">Has already been linked.</a>

<a href="https://stackoverflow.com/">https://stackoverflow.com/</a> is a wonderful URL.

<a href="https://stackoverflow.com/">Has already been linked.</a>
4

1 に答える 1

2

文字列を HTML として DOM パーサーにロードし、テキスト ノードを反復処理して、URL を確認します。テキスト ノードの親が<a>タグでないことを確認してください。これにより、取得しているテキストがまだリンクに含まれていないことがわかります。次に、すべての URL を見つけて<a>タグに変換し、DOM で置き換えます。

$doc = new DOMDocument();
$doc->loadHTML( $str);

$xpath = new DOMXpath($doc);
foreach( $xpath->query('//text()') as $text) {
    if( !($text->parentNode->tagName == "a")) {
        $frag = $doc->createDocumentFragment();
        $frag->appendXML( preg_replace('#(http://stackoverflow.com/)#', '<a href="$1">$1</a>', $text->data));
        $text->parentNode->replaceChild( $frag, $text);
    }
}

これは困難な作業である URL を識別するために正規表現に依存していることに注意してください。現在使用しているため、ニーズに合ったものを見つけることをお勧めします。

#(http://stackoverflow.com/)#

ただし、次の入力があるとします。

http://stackoverflow.com/ is a wonderful URL.

<a href="http://stackoverflow.com/">Has already been linked.</a>

<a href="http://stackoverflow.com/">http://stackoverflow.com/</a>

次の出力が生成されます。

<p><a href="http://stackoverflow.com/">http://stackoverflow.com/</a> is a wonderful URL. 

<a href="http://stackoverflow.com/">Has already been linked.</a> 

<a href="http://stackoverflow.com/">http://stackoverflow.com/</a></p>
于 2013-05-02T21:04:22.243 に答える