加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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的.

我希望你能理解一切,我可以帮助你.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读