Я нашел решение без использования регулярных выражений. Я не знаю, является ли это наилучшей практикой, но она работает.
Прежде всего, я разбил текст на строку:
$text = explode(PHP_EOL, $text);
Далее я рассмотрю этот текст $ :
$if = [];
foreach ($test as $key => $line){
if(StringUtils::contains($line, 'if') && (!StringUtils::contains($line, 'endif'))){
$if[$key] = trim($line);
}
}
Как вы можете видеть, я ищу некоторые слова в этом тексте и помещаю их в массив с номером строки для ключа.
Далее я сделайте последний foreach, проверьте условие и замените все:
krsort($if);
$var = 4;
$var1 = 1;
foreach ($if as $ifOffset => $ix){
for($i = $ifOffset, $iMax = count($test); $i<$iMax; $i++){
if(StringUtils::contains($test[$i], 'endif')){
$content = StringUtils::getBetween($text, $test[$ifOffset], $test[$i]);
$cond = trim(str_replace('if', '', StringUtils::getBetween($ix, '{:', ':}')));
$res = eval('return ('.$cond.');');
$ph = $test[$ifOffset].$content.$test[$i];
if($res===true){
$text = str_replace($ph, $content, $text);
}else{
$text = str_replace($ph, '', $text);
}
unset($if[$ifOffset]);
break;
}
}
}
$ var & $ var1 - переменные, которые я использую в условиях. Теперь это:
{:if $var > 3 :}
<p>Bienvenue {{user}} !</p>
{:if $var1 < 2 :}
<p>Wow ! Tu as la permission !</p>
{:endif:}
{:endif:}
{:if $var > 3 :}
<p>Bienvenue {{user}} !</p>
{:if $var1 < 2 :}
<p>Wow ! Tu as la permission !</p>
{:endif:}
{:endif:}
Выводит это:
Bienvenue {{user}} !
Wow ! Tu as la permission !
Bienvenue {{user}} !
Wow ! Tu as la permission !
Вот и мы!
Для функции "StringUtils :: Содержит", вы go:
public static function contains($text, ...$search){
if(!empty($search)){
foreach($search as $key => $value){
if(strpos($text, $value) !== false){
unset($search, $text, $key, $value);
return true;
break;
}
}
unset($search, $text);
}
return false;
}
Если у кого-то есть идея получше, почему бы и нет, но она работает хорошо!