php – 如何防止第二个正则表达式重新替换?

前端之家收集整理的这篇文章主要介绍了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相关文章