使用PHP我试图让我的正则表达式匹配下面的两个模板引用。问题是,它还从第一个文本块中获取</ul>
。当我删除它只捕获第二个引用的/s
标志时。我做错了什么?
/{{\%USERS}}(.*)?{{\%\/USERS}}/s
这是我的字符串。
<ul class="users">
{{%USERS}}
<li>{%}</li>
{{%/USERS}}
</ul>
{{%USERS}} hello?!{{%/USERS}}
为什么我的表情会抓得太多或太少?
答案 0 :(得分:2)
你可能需要使用非贪婪的量词。
*
和+
是“贪婪的”。他们会尽可能多地匹配角色。
*?
和+?
是“非贪婪的”。它们只匹配所需的字符数,以便继续前进到正则表达式的下一部分。
所以在以下测试字符串中:
<alpha><bravo>
<.+>
将捕获<alpha><bravo>
(因为.
与><
匹配
井!)。<.+?>
将捕获<alpha>
。答案 1 :(得分:1)
为什么我的表情会抓得太多或太少?
它的捕获太多了,因为默认情况下量词是贪婪的(参见Li-aung Yip回答+1)
如果删除修饰符s
,它只匹配第二次出现,因为该修饰符使.
也匹配换行符,所以没有它,就不可能匹配第一部分,因为中间有换行符。
参见非贪婪的答案
{{\%USERS}}(.*?){{\%\/USERS}}
here on Regexr,是测试正则表达式的好地方。
顺便说一下。我删除了捕获组之后的?
,不需要它,因为*
也匹配空字符串,所以不需要另外选择它。
答案 2 :(得分:0)
这是你的正则表达式:
/{{%USERS}}([^{]+({%[^{]+)?){{%/USERS}}/g