我有一个代码块,它将采用如下所示的文本块:
示例文本示例文本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。
答案 0 :(得分:0)
将代码添加到模式的开头以捕获开始的锚标记,然后在捕获到某些内容时不执行回调代码:
/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/
然后你需要在你的lamda函数中添加一个if来查看$ matches中是否有任何内容[1](不要忘记增加你的捕获量)
你不能在断言后面使用负面看法,因为捕获不是一个固定的长度,但是你可以对结束标记使用负向前看断言,因此它会丢弃整个匹配:
/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)(?!<\/a>)/