PHP匹配大多数外部括号

时间:2017-10-05 01:18:13

标签: php regex

我有一个看起来像这样的字符串:

$sample = <<<EOD
lots of gibberish
before what I want{{Template
| x = 1
| y = 2|z= 3}}more gibberish
here too. {{Other|test}}
EOD;

我想摆脱胡言乱语,只是得到:

$sample = <<<EOD
{{Template
| x = 1
| y = 2|z= 3}}
EOD;

我通常会查找“{{Template”并以“}}”结尾,但我的问题是,它有时会看起来像这样:

$sample2 = <<<EOD
lots of gibberish
before what I want{{Template
| x = 1
| y = {{Convert|1|2}}|z= {{Convert|3|4}}}}more gibberish
here too. {{Other|test}}
EOD;

在这种情况下,它会打开和关闭一些curley括号,但我希望它与此匹配:

$sample2 = <<<EOD
{{Template
| x = 1
| y = {{Convert|1|2}}|z= {{Convert|3|4}}}}
EOD;

我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

\{\{Template[^\{]*(?:\{\{[^\}]*\}\}[^\{]*)*?[^\{]*\}\}

请参阅演示here

<强>解释

\{\{Template                //Starts with {{Template
[^\{]*                      //Any chars except {
(?:\{\{[^\}]*\}\}[^\{]*)*?  //Any inner groups+trailing chars conditional
[^\}]*                      //Any chars except {
\}\}                        //Ends with }}

答案 1 :(得分:0)

\{(.*)\}/s

这应与最外面的括号匹配,包括中间的换行符。

(\{\{Template(.*)\}\})\w+/s

这将匹配{{Template start with a}},然后是一些乱码。 “模板”部分将存储在$ 1