可能です!再帰的な正規表現を使用して、各レベルのコンテンツを作成できます。
$data = <<<LOD
{{START1}}
aaaaa
{{START2}}
bbbbb
{{START3}}
ccccc
{{START4}}
ddddd
{{END4}}
{{END3}}
{{END2}}
{{END1}}
LOD;
$pattern = '~(?=({{START\d+}}(?>[^{]++|(?1))*{{END\d+}}))~';
preg_match_all ($pattern, $data, $matches);
print_r($matches);
説明:
部:({{START\d+}}(?>[^{]++|(?1))*{{END\d+}})
パターンのこの部分は、ネストされた構造を記述し{{START#}}
、{{END#}}
( # open the first capturing group
{{START\d+}}
(?> # open an atomic group (= backtracks forbidden)
[^{]++ # all that is not a { one or more times (possessive)
| # OR
(?1) # refer to the first capturing group itself
) # close the atomic group
{END\d+}} #
) # close the first capturing group
問題は、文字列のすべての文字がパターンによって消費されるため、この部分だけですべてのレベルをキャプチャできないことです。つまり、文字列の重複部分を一致させることはできません。
問題は、この部分をすべて、 lookahead のような文字を消費しないゼロ幅アサーション内にラップする(?=...)
ことです。結果:
(?=({{START\d+}}(?>[^{]++|(?1))*{{END\d+}}))
これはすべてのレベルに一致します。