模板的正则表达式捕获太多

时间:2012-05-04 05:07:50

标签: php regex templates

使用PHP我试图让我的正则表达式匹配下面的两个模板引用。问题是,它还从第一个文本块中获取</ul>。当我删除它只捕获第二个引用的/s标志时。我做错了什么?

/{{\%USERS}}(.*)?{{\%\/USERS}}/s 

这是我的字符串。

<ul class="users">
{{%USERS}}
<li>{%}</li>
{{%/USERS}}
</ul>

{{%USERS}} hello?!{{%/USERS}}

为什么我的表情会抓得太多或太少?

3 个答案:

答案 0 :(得分:2)

你可能需要使用非贪婪的量词。

*+是“贪婪的”。他们会尽可能多地匹配角色。

*?+?是“非贪婪的”。它们只匹配所需的字符数,以便继续前进到正则表达式的下一部分。

所以在以下测试字符串中:

<alpha><bravo>
  • <.+>将捕获<alpha><bravo>(因为.><匹配 井!)。
  • <.+?>将捕获<alpha>

答案 1 :(得分:1)

  

为什么我的表情会抓得太多或太少?

  1. 它的捕获太多了,因为默认情况下量词是贪婪的(参见Li-aung Yip回答+1)

  2. 如果删除修饰符s,它只匹配第二次出现,因为该修饰符使.也匹配换行符,所以没有它,就不可能匹配第一部分,因为中间有换行符。

  3. 参见非贪婪的答案

    {{\%USERS}}(.*?){{\%\/USERS}}
    

    here on Regexr,是测试正则表达式的好地方。

    顺便说一下。我删除了捕获组之后的?,不需要它,因为*也匹配空字符串,所以不需要另外选择它。

答案 2 :(得分:0)

这是你的正则表达式:

/{{%USERS}}([^{]+({%[^{]+)?){{%/USERS}}/g