我的问题与这个问题类似:
如何模仿 StackOverflow 自动链接行为
但是,此解决方案不适用于可能已包含链接的混合内容 - A 标记内已存在的任何 URL<a href="http://stackoverflow.com">My Link</a>
正在被撞成<a href="<a href="http://stackoverflow.com">stackoverflow.com</a>">My Link</a>
这是所需的行为:
Before
https://stackoverflow.com/ is a wonderful URL.
<a href="https://stackoverflow.com/">Has already been linked.</a>
After
<a href="https://stackoverflow.com/">https://stackoverflow.com/</a> is a wonderful URL.
<a href="https://stackoverflow.com/">Has already been linked.</a>
在 DOM 解析器中将字符串作为 HTML 加载,迭代文本节点,并检查 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>
It 产生这个输出:
<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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)