Определить, 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]
1 answers
Тест, который я РЕГУЛЯРНОЕ выражение работает отлично
Однако я считаю, что было бы лучше заменить ее на ~\[if([^\]]*)\]\s*?(.*?)\[\/if\]~s
Посмотрите, работает REGEX 101.
Большой шаг в измененных s
, что делает .
(Dot) принято разрывы строк \n
.
Тогда вы найдете в состояние 1-й группы и "trueval"(содержание), в группе 2.
Примечание
- , может быть, будет интересно обмениваться
([^\]]*)
,( [^\]]+)
убедиться, что есть по крайней мере одно условиеif
. -
(.*?)
гарантирует, что будет захватывать меньше контента.