сделать выражение рекурсивным для вложенных элементов - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть простая система шаблонов, и регулярное выражение ловит некоторые специальные теги, такие как условия if.теперь мне нужно условие if внутри условия if и мое текущее выражение разрывается на первый if-endtag.

Я пробовал (? R) и некоторые другие, но либо я не получаю HTML-теги внутри скобокили они разбиваются на первый / #, если

{{{#if(.*?)}}}(.*?){{{\/#if}}}

и мой HTML-код

{{{#if:header:!=:}}}
    <div class="header">
        <h1>
                {{{header}}}
                {{{#if:header_bar:!=:}}}
                    <div class="headbuttons">
                        {{{header_bar}}}
                    </div>
                {{{/#if}}}
            </h1>
        </div>
    {{{/#if}}}

ожидается один возврат из #if: header:! =:}}} ко второму/ # если

Может кто-нибудь помочь мне, пожалуйста, получить эту работу?

1 Ответ

0 голосов
/ 14 февраля 2019

Я пробовал (? R)…

(?R) работает;вместо простого if-body (.*?) мы можем использовать чередование с рекурсивным шаблоном .*?(?R).*? с одной стороны и простым шаблоном .*? с другой стороны: (.*?(?R).*?|.*?).Образец:

preg_match('/{{{#if(.*?)}}}(.*?(?R).*?|.*?){{{\/#if}}}/s', '
{{{#if:header:!=:}}}
    <div class="header">
        <h1>
                {{{header}}}
                {{{#if:header_bar:!=:}}}
                    <div class="headbuttons">
                        {{{header_bar}}}
                    </div>
                {{{/#if}}}
            </h1>
        </div>
    {{{/#if}}}', $matches);
echo $matches[0], "\n";

Выход:

{{{#if:header:!=:}}}
    <div class="header">
        <h1>
                {{{header}}}
                {{{#if:header_bar:!=:}}}
                    <div class="headbuttons">
                        {{{header_bar}}}
                    </div>
                {{{/#if}}}
            </h1>
        </div>
    {{{/#if}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...