I7uoHep
@I7uoHep

Как правильнее составить регулярное выражение?

Привет.
Имеется следующая строка
"$cond($eq($HND,1),0.85*($m1*1.2*1.03*$MWS/100)+0.03*($MW+$mw)/2-1,1.2*($m1*1.2*1.03*$MWS/100)+0.03*($MW+$mw)/2+1)"

Которая находится внутри текста.
Мне необходимо правильно составить выражение, что бы получить следующие значения(внутри "" могут быть разные конструкции, но суть регулярки одна и та же)
Array(
        [0] => array(
                          [0] => '$cond',
                          [1] => '$eq($HND,1)',
                          [2] => '0.85*($m1*1.2*1.03*$MWS/100)+0.03*($MW+$mw)/2-1,1.2*($m1*1.2*1.03*$MWS/100)+0.03*($MW+$mw)/2+1'
                          ),
        [1] => array(
                           [0] => '$eq',
                           [1] => '$HND',
                           [2] => '1'
                          )

Грубо говоря, разложить функции внутри этой конструкции на составляющие
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
@Beltoev
Живу в своё удовольствие
Учитывая, что аргументами могут быть и другие функции, одними регулярками тут мало что сделаете (кстати, у вас в примере Array[0][2] не верный, так как, по логике, строка
1.2*($m1*1.2*1.03*$MWS/100)+0.03*($MW+$mw)/2+1
должна была уйти в Array[0][3] третьим аргументом функции)

Такую задачу можно было бы решить по следующему алгоритму:
  • 1. Перебираем строку до первого вхождения символа "("
  • 1. 1. Если символ не найден, прекращаем выполнение
  • 1. 2. Если символ найден, сохраняем название функции и продолжаем перебор до вхождения символов ",", ")", НО если встречаем символ "(" (вложенная функция) - увеличиваем счетчик скобок на 1
  • 2. Если нашли какой-то из символов ",", ")", проверяем счетчик скобок
  • 2. 1. Если счетчик скобок равен нулю и найденный символ - ")" - сохраняем аргумент, обрезаем строку регуляркой [^(]+[(](.*)[)] и возвращаемся к пункту 1, иначе, если найденный символ - "," - сохраняем аргумент и переходим к пункту 2
  • 2.2. Если счетчик скобок не равен нулю, отнимаем от счетчика 1 и переходим к пункту 2


Реализовать можно как рекурсией, так и простым циклом. Вроде доходчиво всё расписал и ничего не упустил
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы