Как получить метод / функцию в строке с помощью регулярных выражений - PullRequest
2 голосов
/ 12 марта 2020

Я пытаюсь получить аргументы из функции в строке.

Аргумент может содержать:

Пример

Заполнитель:

{{request.expires_in}}
//can match regex: \{\{[a-zA-z0-9\.\-\_]\}\}

функция

@func_compare('string1','string2',1234)

Другие:

dERzUxOfnj49g/kCGLR3vhzBOTLwEMgrpa1/MCBpXQR2NIFV1yjraGVZLkujG63J0joj+TvNocjpJSQq2TpPRzLfCSZADcjmbkBkphIpsT8=
//Any string except brackets

Чехол

Ниже приведен пример с которым я работаю.

Содержимое:

@func_compare('string1',@func_test(2),1234),'Y-m-d H:i:s',@func_strtotime({{request.expires_in}} - 300)

Regex используя:

(?<=@func_compare\().*[^\(](?=\))

Я ожидаю, получит

'string1',@func_test(2),1234

Но что соответствовало регулярное выражение теперь равно

'string1',@func_test(2),1234),'Y-m-d H:i:s',@func_strtotime({{request.expires_in}} - 300

Каждый знает, как получить аргументы в скобках @func_strtotime. Я буду признателен за любой ответ.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вы получите результат, используя рекурсивное регулярное выражение:

(?<=@func_compare\()([^()]*\((?:.*?\)|(?1))*)[^()]*(?=\))

Демонстрация и объяснение

1 голос
/ 12 марта 2020

Не могли бы вы попробовать:

(?<=@func_compare\().*?(?:\(.*?\).*?)?(?=\))

, который будет работать в обоих случаях.

[Объяснение регулярного выражения]

.*?(?:\(.*?\).*?)?(?=\))

.*?                       the shortest match not to overrun the next pattern
   (?:\(.*?\).*?)?        a group of substring which includes a pair of parens followed by another substring of length 0 or longer
                  (?=\))  positive lookahead for the right paren
...