我输入的路上有两个正则表达式,这些:
// replace a URL with a link which is like this pattern: [LinkName](LinkAddress) $str= preg_replace("/\[([^][]*)]\(([^()]*)\)/","<a href='$2' target='_blank'>$1</a>",$str); // replace a regular URL with a link $str = preg_replace("/(\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|])/i","<a href=\"$1\" target=\"_blank\">untitled</a>",$str);
现在有一个问题(不知何故发生碰撞).对于常规URL,一切都很好.但对于基于模式的URL,存在一个问题:第一个正则表达式创建了该链接,第二个正则表达式再次创建了其href属性值的链接.
我该如何解决?
编辑:根据评论,我怎样才能创建一个正则表达式而不是那两个正则表达式? (使用preg_replace_callback).老实说,我尝试过,但它不适用于任何类型的URL ..
将它们组合成为可能?因为那些的输出并不相同.第一个具有LinkName,第二个具有未命名的常量字符串作为其LinkName.
$str = preg_replace_callback('/\[([^][]*)]\(([^()]*)\)|(\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|])/i',function($matches) { if(isset($matches[3])) { // replace a regular URL with a link return "<a href='".$matches[3]."' target='_blank'>untitled</a>"; } else { // replace a URL with a link which is like this pattern: [LinkName](LinkAddress) return "<a href=".$matches[2]." target='_blank'>".$matches[1]."</a>"; } },$str); echo $str;
一种方法就是这样做.您将两个表达式与替代字符|合并在一起.然后在你的回调函数中,你只需检查你的第三个捕获组是否已设置(isset($matches [3])),如果是,那么你的第二个正则表达式匹配字符串并替换普通链接,否则你用链接替换/ linktext的.
我希望你能理解一切,我可以帮助你.