php preg_替换模式[[和]]

php preg_替换模式[[和]],php,preg-replace,preg-match,Php,Preg Replace,Preg Match,我似乎无法使我的代码正常工作 考虑一个字符串 $string = "the [[quick [[brown]] fox [jumps]] over the]] lazy dog"; 我想删除[[]中的所有单词,从而得到一个结果“懒惰的狗” 使用preg\u replace('/\[\[(.*?\]\]\]/s',''.$string)将给我一个结果: 懒惰的狗 这是错误的。有人对此有办法吗?试试这个: preg_replace('/\[\[.*\]\]/s', '' ,$string) 操作

我似乎无法使我的代码正常工作

考虑一个字符串

$string = "the [[quick [[brown]] fox [jumps]] over the]] lazy dog";
我想删除[[]中的所有单词,从而得到一个结果“懒惰的狗”

使用
preg\u replace('/\[\[(.*?\]\]\]/s',''.$string)
将给我一个结果:

懒惰的狗

这是错误的。有人对此有办法吗?

试试这个:

preg_replace('/\[\[.*\]\]/s', '' ,$string)

操作上的差异是
(?:\[\[.*?\]\]\].*)*?
。它首先尝试匹配带括号的字符串,而不是
*?
,如果匹配失败,它将尝试

使用正则表达式进行匹配。我建议用手来做

function replace_brackets($source) {
    $result = '';
    $brackets = 0;
    foreach (preg_split('/(\[\[|\]\])/', $source, -1, PREG_SPLIT_DELIM_CAPTURE) as $segment) {
        if ($segment == '[[') {
            $brackets++;
        } else if ($segment == ']]') {
            $brackets--;
        } else if ($brackets == 0) {
            $result .= $segment;
        }
   }

   return $result;
}

echo replace_brackets("the [[quick [[brown]] fox [jumps]] over the]] lazy dog [[ta]] da\n");

它是否必须与正则表达式一起使用,或者您是否愿意使用其他方法?如果有一种比正则表达式更快的替代方法,那就太好了。这个表达式是贪婪的,所以它不适用于以下内容:
“快速[[brown]]狐狸[跳过]]懒狗[[还有这个]]”
可能适用于他的示例字符串,但是那棕色的狐狸呢?它将取代太多。这只工作到2级如何
的[[quick[[brown]]fox[[jumps[[Other inside]]]]lazy dog
Regex是疯狂的印象,因为它看起来像是你在试图清洁键盘,但实际上确实有东西。@Ralpu,Regex不适合递归的东西。如果你想要额外的级别,你可能需要用php来写。。。除非你想转到.net。net正则表达式实现具有额外的“深度”功能,可用于解决此问题。
function replace_brackets($source) {
    $result = '';
    $brackets = 0;
    foreach (preg_split('/(\[\[|\]\])/', $source, -1, PREG_SPLIT_DELIM_CAPTURE) as $segment) {
        if ($segment == '[[') {
            $brackets++;
        } else if ($segment == ']]') {
            $brackets--;
        } else if ($brackets == 0) {
            $result .= $segment;
        }
   }

   return $result;
}

echo replace_brackets("the [[quick [[brown]] fox [jumps]] over the]] lazy dog [[ta]] da\n");