繁体   English   中英

在preg_match_all中使用正则表达式变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM