2

这是问题所在:给定一个字符串

"<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) 第一个问题的部分解决方案可以在这里找到。基本上,我们使用正则表达式

(?={((?:[^{}]++|{(?1)})++)})
并在结果数组的索引 1 处找到匹配项。

这是部分的,因为我仍然需要找到一种忽略转义大括号的方法。

(2) 正如马里奥所建议的那样,我正在考虑使用递归正则表达式。将在此处发布结果。

多谢你们!

4

1 回答 1

1

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

这似乎是您正在寻找的内容:

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

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

~ 每个杰瑞的回答

注意:为了比较——简单地忽略转义的大括号是通过(?<!\\)在表达式的开头添加一个负前瞻来完成的,如下所示:

(?<!\\)(?={((?:[^{}]++|{(?1)})++)})
于 2013-10-11T06:17:37.833 回答