如果找到特定字符串,则正则表达式停止匹配

时间:2016-04-15 21:06:44

标签: php regex templates

我有以下正则表达式:

/{%\h?if ((?:@)?(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:\.(?:[a-zA-Z0-9_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))*)\h?%}([\s\S]*){%\h?end if\h?%}/U

它基本上符合以下内容:

{% if variable %}
whatever stuff
{% end if %}

我正在尝试修改它以匹配上面的内容或像这样:

{% if variable %}
some stuff
{% else %}
whatever stuff
{% end if %}

之后我希望能够说if else_capture_group is not empty, then do something

我试着看负面的前瞻:

{%\h?if ((?:@)?(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:\.(?:[a-zA-Z0-9_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))*)\h?%}([\s\S](?!{% else %}))(?:{%\h?else\h?%}([\s\S]*))?{%\h?end if\h?%}

但按照:https://regex101.com/r/wP4vS9/1,它不起作用......我不确定为什么。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

在这里,我尝试缩短它并添加了一个驯化的贪婪令牌,以使其与可选的else块一起使用:

(?s){%\s*if\s+(?<var>@?(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:\.(?:(?1)))*)\h*%}(?<if>(?:(?!{% e(?:lse|nd if) %}).)*)(?:{%\h*else\h*%}(?<else>[\s\S]*?))?{%\h*end if\h*%}

请参阅regex demo

一些细节:

  • {%\s*if\s+(?<var>@?(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:\.(?:(?1)))*)\h*%} - 我们捕获var部分的第一部分(捕获组可能需要调整,但想法很明确)
  • (?<if>(?:(?!{% e(?:lse|nd if) %}).)*) - 匹配并捕获if代码块的驯化贪婪令牌
  • (?:{%\h*else\h*%}(?<else>[\s\S]*?))? - 与?部分相匹配的可选(由于else结尾)组
  • {%\h*end if\h*%} - end分隔符