正则表达式匹配未转义的配对括号和嵌套函数调用

时间:2013-08-20 16:04:18

标签: php regex templating

这是问题:给出一个像

这样的字符串
"<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所建议的那样。将在此处发布结果。

谢谢,伙计们!

1 个答案:

答案 0 :(得分:1)

从评论中复制答案,以便从“未答复”过滤器中删除此问题:

这似乎是您正在寻找的:

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

链接:http://www.regex101.com/r/uI4qN0

〜每Jerry

回答

注意:为了进行比较 - 只需忽略转义大括号就可以通过在表达式的开头添加否定前瞻(?<!\\)来实现,如下所示:

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