Php 复杂的正则表达式。如何在多个阶段执行

Php 复杂的正则表达式。如何在多个阶段执行,php,regex,Php,Regex,以下是我将要筛选的内容: YO_{ YO_{ YO_{ McDonalds. } } } 现在,我想过滤掉YO{和}之间的文本。我这样做: $another_var = preg_replace_callback( '/YO\_\{(.*?)\}/s', function($matches) { return $matches[1]; }, $variable_where_t

以下是我将要筛选的内容:

YO_{
    YO_{
        YO_{
            McDonalds.
        }
    }
}
现在,我想过滤掉YO{和}之间的文本。我这样做:

$another_var = preg_replace_callback(
    '/YO\_\{(.*?)\}/s',
    function($matches) {
        return $matches[1];
    },
    $variable_where_the_content_is_stored
);
但它正在回归:

YO_{
    YO_{
        McDonalds.
    }
}
而不是返回麦当劳

如何允许筛选过程(regex)经历多个阶段

代码只是一个示例,并且只使用了我试图构建的概念。实际代码要复杂得多,可能会造成混乱。我只需要经历多个过滤阶段的想法


谢谢!:)

以下是工作代码:检查内部的注释以获得修复

print preg_replace_callback(
    '/.*YO\_\{\s*([^}]*?)\s*\}.*/s',  // mistake 1 check \s*([^}]*?)\s* and .*
    function($matches) {
        return $matches[1];  // mistake 2
    },
    $variable_where_the_content_is_stored
);
但是,您也可以使用
preg\u match()


您可能想看看递归正则表达式。看见php的最新版本确实支持递归正则表达式。

实际上,您可以将正则表达式稍作修改,然后使用match:

YO_\{[^{}]+\}

[^{}]+
将匹配非
{}
字符

如果希望内部文本不带空格,可以使用:

YO_\{\s*([^{}]+?)\s*\}
并提取包含匹配项的数组的第一个元素。

您可以将其与负前瞻一起使用:

$str = <<< EOF
YO_{
    YO_{
        YO_{
            McDonalds.
        }
    }
}
EOF;
if (preg_match('/ YO_ (?!.*?YO_) \{ ( (?: [^{}]* | (?0) )* ) \} /sx', $str, $arr))
   echo(trim($arr[1])); // McDonalds.

$str=对我来说,这看起来像是一种实际的可解析数据格式,比如JSON。你可能想考虑实际使用其他解决方案比使用RexEclipse好,但我不知道这比什么更好?“
YO_{\s*(.*?\s*}
中存在一些问题,即它不一定强制使用匹配括号。
$str = <<< EOF
YO_{
    YO_{
        YO_{
            McDonalds.
        }
    }
}
EOF;
if (preg_match('/ YO_ (?!.*?YO_) \{ ( (?: [^{}]* | (?0) )* ) \} /sx', $str, $arr))
   echo(trim($arr[1])); // McDonalds.