Я создаю синтаксический анализатор псевдопеременных на PHP, чтобы обеспечить чистый и простой синтаксис в представлениях, и реализовал механизм для операторов if. Теперь я хочу иметь возможность использовать вложенные операторы if, и самым простым и элегантным решением, которое я придумал, было использование идентификации в качестве маркера для блока.
Итак, это в основном макет, который я ищу в представлении:
{if x is empty}
{if y is array}
Hello World
{endif}
{endif}
Сценарий найдет первый оператор if и сопоставит его с оператором endif на той же глубине. Если он оценивается как true, внутренний блок также будет проанализирован.
Теперь у меня возникли проблемы с настройкой регулярного выражения для использования глубины в следующем коде:
preg_match_all('|([\t ]?){if (.+?) is (.+?)}(.+?){endif}|s', $template, $match);
По сути, я хочу, чтобы первое совпадение в ([\t ]?)
было помещено перед {endif}
с использованием какой-то переменной, и убедиться, что выражение не будет полным, если нет совпадения {endif}
на той же глубине, что и {if ...}
.
Можете ли вы помочь мне завершить его?