正規表現 (PCRE) の使用は、ネストされたレベルごとに内部コンテンツを再解析する必要があるような場合には最適ではありません (適切なパーサーを使用する方がよい理由の 1 つです)。
つまり、次のようなパターンで実行できます。
~
{if:\s*+
(?<condition>
[^{}]++
)
}
(?<then>
(?:
(?:(?!{if:[^{}]++}|{else}|{/endif}).)*+
(?R)*+
)*+
)
(?:
{else}
(?<else>
(?:
(?:(?!{if:[^{}]++}|{else}|{/endif}).)*+
(?R)*+
)*+
)
)?+
{/endif}
~six
Perl の例@ideone .
このテキストについて
if: "'x' == 'y'"}
a
{else}
b
{/endif}
{if: "'x' == 'y'"}
c
{/endif}
{if:minimal}{else}{/endif}
{if: "'nested' == 'things'"}
{if: "'x' == 'y'"}x{if:minimal}{else}{/endif}x{/endif}
{else}
b{if: "'x' == 'y'"}c{/endif}{if: "'x' == 'y'"}c{/endif}
{/endif}
{if:foo} unbalanced {if:bar}ignores first if{/endif}
一致する
*** matched if:
* cond: "'x' == 'y'"
* then:
a
* else:
b
*** matched if:
* cond: "'x' == 'y'"
* then:
c
*** matched if:
* cond: minimal
* then:
* else:
*** matched if:
* cond: "'nested' == 'things'"
* then:
{if: "'x' == 'y'"}x{if:minimal}{else}{/endif}x{/endif}
* else:
b{if: "'x' == 'y'"}c{/endif}{if: "'x' == 'y'"}c{/endif}
*** matched if:
* cond: bar
* then: ignores first if