2010-01-26 156 views
1

我有一个代码块,将采取类似下面的文本块替换非HTML链接方法和以下正则表达式:与<A>标签

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

将示例文本转换为如下形式:

示例文本示例文本< A HREF = “http://www.google.com”>http://www.google.com </A>示例文本

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

回答

0

将代码添加到模式的开始捕捉开口锚标记,然后不执行回调的代码时,它已经拍摄了一句:

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

那么你需要,如果添加到您的lamda函数来查看是否有任何$匹配[1](不要忘记增加您的捕获以及)

你不能在这里使用否定的背后断言,因为捕获不是一个固定的长度,但你可能会对结束标记使用负面预测声明,因此会丢失整个匹配项:

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

你的第一个表达式匹配正确,以及刚刚返回$比赛[0]当$匹配[1]不为空,我可以解决这个问题很容易。但是你的第二个表达式返回:未知的修饰词“一” – tombazza 2010-01-26 12:59:26

+0

对不起,我忘了斜线/中,以便将需要<\/a>否则它认为它是结束模式,一个是修改 – 2010-01-26 14:09:00