Php preg#u replace将url替换为[link]和[/link]之间的超链接,但link可以';科坦?或()

Php preg#u replace将url替换为[link]和[/link]之间的超链接,但link可以';科坦?或(),php,preg-replace,Php,Preg Replace,我的代码: preg_match_all('(\[(link)\](.*?)\[/(link)\])', $message, $matches); $matches = $matches[2]; foreach($matches as $match){ //CHECK LINK AND VERIFY $message = preg_replace('(\[(link)\]('.$match.')\[/(link)\])', '<a href="'.$match.'" target=

我的代码:

preg_match_all('(\[(link)\](.*?)\[/(link)\])', $message, $matches);
$matches = $matches[2];
foreach($matches as $match){
  //CHECK LINK AND VERIFY
  $message = preg_replace('(\[(link)\]('.$match.')\[/(link)\])', '<a href="'.$match.'" target="_blank">'.$match.'</a>', $message);
}
preg\u match\u all('(\[(link)\](.*?\[/(link)\]),$message,$matches);
$matches=$matches[2];
foreach($matches作为$match进行匹配){
//检查链接并验证
$message=preg\u replace(“(\[(链接)\]”(“.$match.”)\[/(链接)\])”,“$message”);
}
正如你在这里看到的 该脚本可以工作,但无法替换包含()或“”的链接

不管怎样,我能解决这个问题吗


Sry,如果我重新发布,我不知道是否可以对旧帖子发表评论并得到回复。

你可以使用一个preg\u替换:

$message = preg_replace('~\[link\](.+?)\[/link\]~', '<a href="$1" target="_blank">$1</a>', $message);
$message=preg\u replace(“~\[link\]”(.+?)\[/link\]~”,“$message”);
如果要在替换之前验证链接,请使用:

$message=preg\u replace\u回调(
“~\[link\](.+?)\[/link\]~”,
函数($match){
#调用函数来验证链接
if(验证链接($match[1])){
返回“”;
}否则{
返回“验证失败时需要什么!”;
}
},
$message
);

您必须在regex中添加分隔符也许您应该使用
preg\u replace\u callback()
替换regex找到的子字符串:@Toto我认为
是这里的分隔符。这可能会引起一个问题。Mikkel,试试看“~\[link](.*?\[/link]~”@WiktorStribiżew:是的,但是没有组2。添加delimiers更简单。@Toto我没有注意到使用了两个正则表达式函数:)这是对计算能力的浪费。我想知道是否存在类似
[link][/link]
的情况。如果是,您需要
*?
@WiktorStribiżew:谁知道?但是有一个空链接似乎很奇怪。它可以正确地替换,但是不要忘记为什么你需要[链接]!如果您将任何用户的url直接插入html,您就有XSS漏洞。Yum必须筛选输入和转义输出@Toto我真的想要一个foreach循环,因为我想通过数据库运行链接,并检查它是否是病毒或类似的东西。
$message = preg_replace_callback(
            '~\[link\](.+?)\[/link\]~', 
            function($match) {
                # call your function to validate the link
                if (validate_link($match[1])) {
                    return '<a href="'.$match[1].'" target="_blank">'.$match[1].'</a>';
                } else {
                    return 'What you want when validation fail!';
                }
            },
            $message
       );