用<a> tags</a>替换非HTML链接

时间:2010-01-26 11:53:09

标签: php hyperlink preg-replace

我有一个代码块,它将采用如下所示的文本块:

  

示例文本示例文本http://www.google.com示例文本

使用preg_replace_callback方法和以下正则表达式:

preg_replace_callback('/http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/',
    create_function(
        '$matches',
        '$url = $matches[1]; 
        $anchorText = ( strlen($url) > 35 ? substr($url, 0, 35).\'...\' : $url); 
        return \'<a href="http://\'. $url .\'">\'. $anchorText .\'</a>\';'),
    $str);

将示例文本转换为:

  

示例文本示例文本&lt; a href =“http://www.google.com”&gt; http://www.google.com&lt; / A&GT;示例文本

我现在的问题是我们引入了一个富文本编辑器,可以在发送到脚本之前创建链接。我需要更新这段代码,以便它会忽略标签内已有的任何URL。

1 个答案:

答案 0 :(得分:0)

将代码添加到模式的开头以捕获开始的锚标记,然后在捕获到某些内容时不执行回调代码:

/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/

然后你需要在你的lamda函数中添加一个if来查看$ matches中是否有任何内容[1](不要忘记增加你的捕获量)

你不能在断言后面使用负面看法,因为捕获不是一个固定的长度,但是你可以对结束标记使用负向前看断言,因此它会丢弃整个匹配:

/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)(?!<\/a>)/