文字列を 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>