Как составить регулярку на PHP для замены синтаксиса логики псевдокода в синтаксис TWIG?

Для примера есть такой псевдо код:
ЕСЛИ(2.22>3;3+0.01;ЕСЛИ(2.22>0.5;0.1;1))
Который может быть сложнее с учетом нескольких ветвлений, так и простым. Нужно преобразовать в шаблон Twig с учетом его синтаксиса логики, для приведенного примера, результат должен быть таким:
{%if (2.22>3)%}
  {{3+0.01}}
{%else%}
  {%if (2.22>0.5)%}
    {{0.1}}
  {%else%}
    {{1}}
  {%endif%}
{%endif%}

В регулярках всегда был не силен, помогите хотя бы примерным направлением копания, дальше попробую разобраться.
  • Вопрос задан
  • 2626 просмотров
Решения вопроса 1
@BatteryLow Автор вопроса
В общем если кому пригодится поступил в итоге так:

Рекурсивно сформировал массив с содержимым скобок в строке функцией:
function recursiveSplit($string, $layer, &$result) {
        preg_match_all("/ЕСЛИ\((([^()]*|(?R))*)\)/",$string,$matches);

        if (count($matches) > 1) {
            for ($i = 0; $i < count($matches[1]); $i++) {
                if (is_string($matches[1][$i])) {
                    if (strlen($matches[1][$i]) > 0) {
                        $result[$layer][]=$matches[1][$i];
                        $this->recursiveSplit($matches[1][$i], $layer + 1, $result);
                    }
                }
            }
        }
    }

Дальше опять же рекурсивно но, начиная с нижнего уровня(для реализации возможности вложенных ветвлений) прошелся по этому массиву разбивая строки с содержимым скобок с помощью explode (если не получалось, то значит это просто математическое выражение оно обрамлялось в {{ }} для твига) на логическую часть, ветки прохождения проверки и не прохождения соответственно, из этого формировал строку с синтаксисом твига, и заменял на неё псевдокод в исходной строке.

Попахивает говнокодом конечно, но ничего более внятного мой мозг выдать не смог.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
shcherbanich
@shcherbanich
Программист
www.regexr.com - можете постепенно наглядно составлять нужную регулярку
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы