PHP自动链接,如果还没有链接



我的问题与这个问题类似:

如何模拟StackOverflow的自动链接行为

然而,这个解决方案并不适用于可能已经包含链接的混合内容-任何已经在A标签<a href="http://stackoverflow.com">My Link</a>内的url都被打乱到<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>

将字符串作为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>

相关内容