php – 如何防止第二个正则表达式重新替换?
发布时间:2020-12-13 13:45:38 所属栏目:PHP教程 来源:网络整理
导读:我输入的路上有两个正则表达式,这些: // 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
我输入的路上有两个正则表达式,这些:
// 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的. 我希望你能理解一切,我可以帮助你. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |