Регулярен израз, съответстващ на неекранирани сдвоени скоби и вложени извиквания на функции

Ето го проблемът: даден е низ като

"<p>The price for vehicles {capitalize(pluralize(vehicle))} is {format_number(value, language)}</p><span>{employee_name}</span><span>\{do not parse me}</span>"

Имам нужда от (1) шаблон на регулярен израз в PHP, който съвпада с всички стойности между неекранирани двойки къдрави скоби и (2) друг шаблон на регулярен израз, който съответства на извиквания на функции и извиквания на вложени функции (след като първият шаблон бъде съпоставен). Разбира се, ако можех да използвам един регулярен израз само за двете задачи, това би било страхотно.

Между другото, не мога да използвам Smarty, Twig или друга библиотека - това е единствената причина, поради която трябва сам да създам механизъм за анализ.

Благодаря много!

Solution (1) A partial solution for the first problem can be found here. Basically, we use the regex

(?={((?:[^{}]++|{(?1)})++)})
and find the matches at index 1 of the resulting array.

Частично е, защото все пак трябва да намеря начин да игнорирам скритите скоби.

(2) Обмислям използването на рекурсивен регулярен израз, както е предложено от Марио. Ще публикува резултата тук.

Благодаря момчета!


person noobeana    schedule 20.08.2013    source източник
comment
Първият регулярен израз е лесен, но вторият не може да се направи с помощта на PHP. Вместо това ще трябва да използвате анализатор.   -  person Ibrahim Najjar    schedule 20.08.2013
comment
Регулярните изрази не са добър избор за анализиране на вложени/рекурсивни структури.   -  person p.s.w.g    schedule 20.08.2013
comment
Можете да използвате отрицателен lookbehind (?<!\\\\) за избягване на екранирани curlys и (?R) рекурсивен регулярен израз< /a> ако искате да утвърдите правилното влагане на функцията.   -  person mario    schedule 20.08.2013
comment
Благодаря за отговорите Намерих начин да реша (1) тук. Все още не съм постигнал успех с (2).   -  person noobeana    schedule 20.08.2013
comment
@mario Не знаех, че има друг език от .NET, който поддържа вложени структури, +1 за това.   -  person Ibrahim Najjar    schedule 20.08.2013
comment
това ли е, което търсите?   -  person Jerry    schedule 20.08.2013
comment
@Jerry - Ако искате да обобщите решението като свой собствен отговор, ще изтрия отговора си. (Вижте meta.stackexchange.com/questions/90263 / за обяснение защо това е полезно.) Благодаря!   -  person DreadPirateShawn    schedule 11.10.2013
comment
@DreadPirateShawn Просто исках да се уверя, че това е необходимото от OP, но те не се върнаха обратно... Опитвам се да избягвам случаи, в които OP има един проблем, който се оказва съвсем различен проблем ^^ Можете да запазите своя отговор :)   -  person Jerry    schedule 11.10.2013
comment
@Jerry - Напълно разбрано. Току-що установих, че се опитвам отново да реша регулярния израз, преди да забележа коментара ви. Да не говорим, че вашето решение изглежда решава нуждите на OP и от моето четене - може също така да маркира като жизнеспособен кандидат за отговор.   -  person DreadPirateShawn    schedule 11.10.2013


Отговори (1)


Копиране на отговора от коментарите, за да се премахне този въпрос от филтъра „Без отговор“:

Изглежда това е това, което търсите:

(?<!\\){([^(){}]+)\(((?:[^(){}]+|\(((?2))\))*)\)}

Връзка: http://www.regex101.com/r/uI4qN0

~ отговор на Джери

Забележка: За сравнение - простото игнориране на екранирани скоби се постига чрез добавяне на отрицателен поглед напред (?<!\\) в началото на израза, ето така:

(?<!\\)(?={((?:[^{}]++|{(?1)})++)})
person DreadPirateShawn    schedule 11.10.2013