Php 如何防止被第二个正则表达式替换?

Php 如何防止被第二个正则表达式替换?,php,html,regex,hyperlink,Php,Html,Regex,Hyperlink,我在输入的过程中有两个正则表达式,它们是: // 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 $st

我在输入的过程中有两个正则表达式,它们是:

// 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替换为类似以下模式的链接:[LinkName](LinkAddress)
$str=preg\u replace(“/\[([^][*])]\([^()]*)\)/”,“”,$str);
//用链接替换常规URL
$str=preg\u replace(“/(\b(?:https?| ftp):\/\/\/\/\ www\)[-a-z0-9+&\/%?=!:,.;]*[-a-z0-9+&\/%=,”,$str);
现在出现了一个问题(某种程度上是碰撞)。对于常规URL,一切都很好。但对于基于模式的URL,存在一个问题:第一个正则表达式创建该URL的链接,第二个正则表达式再次创建其
href
-属性值的链接

我怎样才能修好它

编辑:根据评论,如何创建一个正则表达式而不是这两个正则表达式?(使用
preg\u replace\u回调
)。老实说,我试过了,但它对任何类型的URL都不起作用

把它们结合起来有可能吗?因为它们的输出是不同的。第一个有一个链接名,第二个有一个常量字符串
untitled

$str=preg\u replace\u回调('/\[([^][*])\([^()]*)\)\(\b(?:(:https?;ftp):\/\/\/\\\\\/\\\\\\/%=([-a-z0-9+==!:,。]*.[-a-z0-9+/\/\\/\%/\\\/\%=[-a-a-z0-9++=====,.]%/\/\%/--------------/\\\\\\\\\\%/---------------------,
$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;
函数($matches){ 如果(isset($matches[3])){ //用链接替换常规URL 返回“”; }否则{ //将URL替换为类似以下模式的链接:[LinkName](LinkAddress) 返回“”; } }美元/平方米); echo$str;
一种方法是这样做。将两个表达式与可选字符
|
合并在一起。然后,在回调函数中,您只需检查是否设置了第三个捕获组(
isset($matches[3])
),如果是,则第二个正则表达式与字符串匹配,并替换普通链接,否则替换为link/linktext


我希望您能理解一切,我可以帮助您。

为这两种情况构建一个单一模式(交替使用
)并使用
preg\u replace\u callback
。在回调函数中,必须确定(使用可用的捕获组)找到了哪一个。这样,字符串只被解析一次。@casimirithippolyte感谢您的评论。我这样做了,但它对这些URL都不起作用。@stack然后告诉我们您尝试了什么。我们不能盲目调试。太好了。。。!这正是我需要的+1.