0

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

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

这是我的字符串。

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

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

为什么我的表情捕捉太多或太少?

4

3 回答 3

2

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

*并且+“贪婪”。它们会匹配尽可能多的字符。

*?并且+?是“非贪婪的”。它们将只匹配移动到正则表达式下一部分所需的字符数。

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

<alpha><bravo>
  • <.+>将捕获<alpha><bravo>(因为也.匹配><!)。
  • <.+?>将捕获<alpha>.
于 2012-05-04T05:39:18.043 回答
1

为什么我的表情捕捉太多或太少?

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

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

查看非贪婪的答案

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

在 Regexr 上,这是一个测试正则表达式的好地方。

顺便提一句。我在捕获组之后删除了?它,它不需要,因为*也匹配空字符串,所以不需要让它额外可选。

于 2012-05-04T06:27:21.733 回答
0

这是您的正则表达式:

/{{%USERS}}([^{]+({%[^{]+)?){{%/USERS}}/g
于 2012-05-04T05:32:27.937 回答