Php preg_match_all 只匹配最后一个元素
Php preg_match_all matches only last element
我有这个正则表达式
{{([ a-zA-Z0-9_\-]+)\s*(?:\[([ a-zA-Z0-9_\-]+)\]\s*)*}}
我需要匹配如下字符串:
{{word with spaces}}
{{word with spaces [sub1]}}
{{word with spaces [sub1] [sub 2] [Sub-3] }}
正在捕获 word with spaces
,以及 sub1
、sub 2
、Sub-3
。
正则表达式有效,但 sub-s 字符串匹配仅给出最后一个匹配项,即 Sub-3
。
如何获取全部sub1
、sub 2
、Sub-3
?
谢谢
要在多次组 2 中获取 sub 的值,您可以使用 \G
断言上一场比赛结束时的位置:
(?:{{([\w-]+(?: [\w-]+)*)|\G(?!$))(?:\h+\[([^]]+)\])?(?=.*})
这是另一个使用 \G
的变体,它速度更快并且避免了空匹配:
(?:{{([\w-]+(?:\h+[\w-]+)*)|(?!\A)\G)(?:\h*\[([^]]+)]|\h*}})
\G
断言位置在上一个匹配的末尾或第一个匹配的字符串的开头。
我有这个正则表达式
{{([ a-zA-Z0-9_\-]+)\s*(?:\[([ a-zA-Z0-9_\-]+)\]\s*)*}}
我需要匹配如下字符串:
{{word with spaces}}
{{word with spaces [sub1]}}
{{word with spaces [sub1] [sub 2] [Sub-3] }}
正在捕获 word with spaces
,以及 sub1
、sub 2
、Sub-3
。
正则表达式有效,但 sub-s 字符串匹配仅给出最后一个匹配项,即 Sub-3
。
如何获取全部sub1
、sub 2
、Sub-3
?
谢谢
要在多次组 2 中获取 sub 的值,您可以使用 \G
断言上一场比赛结束时的位置:
(?:{{([\w-]+(?: [\w-]+)*)|\G(?!$))(?:\h+\[([^]]+)\])?(?=.*})
这是另一个使用 \G
的变体,它速度更快并且避免了空匹配:
(?:{{([\w-]+(?:\h+[\w-]+)*)|(?!\A)\G)(?:\h*\[([^]]+)]|\h*}})
\G
断言位置在上一个匹配的末尾或第一个匹配的字符串的开头。