【问题标题】:PHP autolink if not already linkedPHP 自动链接(如果尚未链接)
【发布时间】:2013-05-02 20:16:56
【问题描述】:

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

How to mimic StackOverflow Auto-Link Behavior

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

【问题讨论】:

  • 找到看起来像 url 的文本,然后展开代码以查找包含它的 html 标签。例如如果你在某处有http://,那么在你启动实际的包装逻辑之前检查它实际上不是&lt;a href="http://
  • 我认为可能值得先解析 HTML 的文本块,然后扫描文本节点以查找链接,因此您也可以避免嵌套链接,例如 &lt;a href="http://www.example.com"&gt;http://www.example.com&lt;/a&gt; 到 @987654329 @

标签: php html


【解决方案1】:

在 DOM 解析器中将字符串加载为 HTML,遍历文本节点,并检查 URL。确保文本节点的父节点不是&lt;a&gt; 标记,这样您就知道您获得的文本不在链接中。现在,找到所有的 URL,将它们转换为 &lt;a&gt; 标签,然后在 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>

【讨论】:

  • 接受的答案。创造了充实这个想法的要点。但会自动链接任何 URL,返回整个文档并处理一些 PHP 兼容性问题:gist.github.com/leepowers/5529546
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多