脚本宝典收集整理的这篇文章主要介绍了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 $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的.
我希望你能理解一切,我可以帮助你.
以上是脚本宝典为你收集整理的php – 如何防止第二个正则表达式重新替换?全部内容,希望文章能够帮你解决php – 如何防止第二个正则表达式重新替换?所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。