PHP - 帮助我基于REGEX的递归函数

Gal*_*Gal 2 php regex

我正在从维基百科API中提取一个最初看起来像这样的字符串: 链接文本.我想剥离所有{{...}} 以及它们之间的所有内容(可以是任何类型的文本).为此,我考虑使用带有" preg_match"," preg_replace" 的递归函数.就像是:

function drop_brax($text)
{
    if(preg_match('/{{(.)*}}/',$text)) 
    return drop_brax(preg_replace('/{{(.)*}}/','',$text));
    return $text;
}
Run Code Online (Sandbox Code Playgroud)

由于以下情况,此功能无效:

{{我喜欢mocachino {{但我也喜欢香蕉}}和frutis}}

这将剥离{{和}}的第一次出现之间的所有内容(并留出"和frutis}}").我该怎么做呢?(同时保持漂亮的递归形式).

Bar*_*ers 6

尝试这样的事情:

$text = '...{{aa{{bb}}cc}}...{{aa{{bb{{cc}}bb{{cc}}bb}}dd}}...';
preg_match_all('/\{\{(?:[^{}]|(?R))*}}/', $text, $matches);
print_r($matches);
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => Array
        (
            [0] => {{aa{{bb}}cc}}
            [1] => {{aa{{bb{{cc}}bb{{cc}}bb}}dd}}
        )
)
Run Code Online (Sandbox Code Playgroud)

简短说明一下:

\{\{      # match two opening brackets
(?:       # start non-capturing group 1
  [^{}]   #   match any character except '{' and '}'
  |       #   OR
  (?R)    #   recursively call the entire pattern: \{\{(?:[^{}]|(?R))*}}
)         # end non-capturing group 1
*         # repeat non-capturing group 1 zero or more times
}}        # match two closing brackets
Run Code Online (Sandbox Code Playgroud)