Определить, if и endif с regex?


В примере ОС нашел:

<?php

$a = 22;
$b = 33;

$template = '
[if $b>0 ]
    B > 0
[/if]';

// IF - ENDIF
preg_match_all('/\[if(.*?)\][\s]*?(.*)[\s]*?\[\/if\]/i', $template, $regs, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($regs[0]); $i++) {
    $condition = $regs[1][$i];
    $trueval   = $regs[2][$i];
    $res = eval('return ('.$condition.');');
    if ($res===true) {
        $template = str_replace($regs[0][$i],$trueval,$template);
    } else {
        $template = str_replace($regs[0][$i],'',$template);
    }
}

echo '<h3>Template</h3><pre>'.htmlentities($template).'</pre>';

выход был: B > 0

Вскоре работал отлично, но я не знаю, где я не хватает, чтобы другой синтаксис:

[if var == true]
    [- success -]
[/if]

P. S: [- success -] будет echo, но это к делу не относится, я пытаюсь с помощью следующего кода:

private function _if()
{
    // IF - ENDIF
    preg_match_all('/\[if(.*?)\]*?(.*)*?\[\/if\]/', $template, $regs, PREG_PATTERN_ORDER);
    for ($i = 0; $i < count($regs[0]); $i++) {
        $condition = $regs[1][$i];
        $trueval   = $regs[2][$i];
        echo "Condition: {$condition}<br>";
        echo "TrueVal: {$trueval}<br>";
        /*
        $res = eval('return ('.$condition.');');
        if ($res===true) {
            $template = str_replace($regs[0][$i],$trueval,$template);
        } else {
            $template = str_replace($regs[0][$i],'',$template);
        }*/
    }
}

я Думаю, что ошибка находится в регулярное выражение, так как не вступает в for, поскольку не отображает ничего на ночь внутри. Как бы сделать, чтобы, по крайней мере, найти состояние, в [if ] и работать для нескольких строк? Например:

[if var == true]
    [- success -]
    <p>Oi, tudo bem?</p>
[/if]
Author: Leonardo, 2016-09-19

1 answers

Тест, который я РЕГУЛЯРНОЕ выражение работает отлично

Однако я считаю, что было бы лучше заменить ее на ~\[if([^\]]*)\]\s*?(.*?)\[\/if\]~s

Посмотрите, работает REGEX 101.

Большой шаг в измененных s, что делает .(Dot) принято разрывы строк \n.

Тогда вы найдете в состояние 1-й группы и "trueval"(содержание), в группе 2.

Примечание

  • , может быть, будет интересно обмениваться ([^\]]*) , ( [^\]]+) убедиться, что есть по крайней мере одно условие if.
  • (.*?) гарантирует, что будет захватывать меньше контента.
 4
Author: Guilherme Lautert, 2016-09-20 05:12:02