Я работаю над собственным минималистичным шаблонизатором PHP для использования в личных проектах, мне нужно решить, как сделать некоторые замены с использованием регулярного выражения. У меня есть эта строка:
Код: Выделить всё
$string = 'sometext {% {{ var1 }} middletext {{ var2 }} %} moretext {{ varx }} {% {{ var3 }} %}';
Я хочу заменить все переменные между разделителями {{ }} их эквивалентами PHP, но только если они вложены внутри разделителей {% %}
Это желаемый результат:
Код: Выделить всё
sometext {% $var1 middletext $var2 %} moretext {{ varx }} {% $var3 %}
Пока я пробовал это:
Код: Выделить всё
echo preg_replace('#\{\{\s*(.*?)\s*\}\}#', '\$$1', $string);
Я даже пробовал это регулярное выражение с предварительным просмотром:
Код: Выделить всё
echo preg_replace('#(?=.*\{%?)\{\{\s*(.*?)\s*\}\}(?=.*%\})(?!=.*\{%.*%\})#', '\$$1', $string);
Но в обоих случаях я получаю один и тот же результат: все переменные в строке заменяются независимо от того, находятся ли они внутри разделителей {% %} или нет (обратите внимание, что $varx также нежелательно заменяется) , мой неверный вывод:
Код: Выделить всё
sometext {% $var1 middletext $var2 %} moretext $varx {% $var3 %}
Я решил эту проблему и получил желаемый результат, используя циклы foreach, чтобы сначала сопоставить разделители {% %}, а затем заменить переменные в строке, используя массивы в preg_replace(), например это:
Код: Выделить всё
Подробнее здесь: [url]https://stackoverflow.com/questions/79320559/replace-php-templating-variables-between-double-curly-braces-that-are-nested-ins[/url]