[英]Using regex variables in preg_match_all
我正在PHP中构建一个伪变量解析器,以允许视图中使用简洁明了的语法,并为if语句实现了引擎。 现在,我希望能够使用嵌套的if语句,而我想到的最简单,最优雅的解决方案是将标识用作块的标记。
所以这基本上是我在视图中寻找的布局:
{if x is empty}
{if y is array}
Hello World
{endif}
{endif}
该脚本将找到第一个if语句,并将其与相同深度上的endif匹配。 如果计算结果为true,则还将解析内部块。
现在,我在以下代码中设置正则表达式以使用depth时遇到了麻烦:
preg_match_all('|([\t ]?){if (.+?) is (.+?)}(.+?){endif}|s', $template, $match);
基本上,我想使用某种变量将([\\t ]?)
的第一个匹配项放在{endif}
之前,并确保如果在相同深度上没有匹配的{endif}
,则该语句将不完整作为{if ...}
。
你能帮我完成吗?
通常,您不能使用正则表达式来解决此问题,因为您定义的语言不是正则表达式(因为它需要计算{if}
和{endif}
出现次数)。
您所得到的是经典匹配括号问题的一个变体。
使用某种有限状态机来跟踪{if}
和{endif}
的出现会更好。
\\ 1将包含您的第一个匹配项,因此您可以执行以下操作:
preg_match_all('|([\t ]?){if (.+?) is (.+?)}(.+?)\1{endif}|s', $template, $match);
但是,这不一定与正确的{endif}匹配,而仅与下一个出现正确数量的制表符的匹配。
如果您使用显式的“ endif”语句,则您的代码块已经关闭,并且无需执行任何特殊的缩进,只需匹配'/{if.+?}(.+?){endif}/'。 1另一方面,如果您使用类似python的缩进块,则可以摆脱{endif}(和方括号),仅匹配缩进级别
if condition
this line is in the if block
this one too
this one not
你的表情会像这样
/([\t]+)if(.+)\n((\1[\t]+.+\n)+)/
“条件”将匹配2,语句主体匹配3
1实际上,它应该类似于/{if}((.(?!{if))+?){endif}/s
以便正确处理嵌套。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.