这是问题:给出一个像
这样的字符串"<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或任何其他库 - 这是我自己构建解析机制的唯一原因。
非常感谢!
解决方案 (1)可以找到第一个问题的部分解决方案here。基本上,我们使用正则表达式
(?={((?:[^{}]++|{(?1)})++)})并在结果数组的索引1处找到匹配项。
这部分是因为我仍然需要找到一种忽略转义大括号的方法。
(2)我正在考虑使用递归正则表达式,如Mario所建议的那样。将在此处发布结果。
谢谢,伙计们!
答案 0 :(得分:1)
从评论中复制答案,以便从“未答复”过滤器中删除此问题:
这似乎是您正在寻找的:
(?<!\\){([^(){}]+)\(((?:[^(){}]+|\(((?2))\))*)\)}
链接:http://www.regex101.com/r/uI4qN0
〜每Jerry
回答注意:为了进行比较 - 只需忽略转义大括号就可以通过在表达式的开头添加否定前瞻(?<!\\)
来实现,如下所示:
(?<!\\)(?={((?:[^{}]++|{(?1)})++)})