PHP 自动链接(如果尚未链接)

标签 php html

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

How to mimic StackOverflow Auto-Link Behavior

但是,此解决方案不适用于可能已包含链接的混合内容 - 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>

最佳答案

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

produces this output :

<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>

关于PHP 自动链接(如果尚未链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346961/

相关文章:

c# - 表不继承 css 到控制台应用程序中的电子邮件 Html 模板

java - 从 HTML - <select>--</select> 框中获取选定值

php - 从开发的角度来看,主要内容管理系统的优点/缺点是什么?

php - 创建 View 还是使用 innerjoins?

javascript - 如何在连续循环中放大和缩小 Canvas 图像?

css - HTML 和 CSS 在一行之间对齐 div

html - 当我将鼠标悬停在盒子上时,如何为盒子中的所有元素设置动画?

php - $post->comments()->create() 是否比 Laravel 中的 Comment::create() 更昂贵?

php - mysql插入返回多行

PHP - 文件未使用准备好的语句上传到数据库