我有一个正则表达式列表:
suresnes|suresne|surenes|surene
pommier|pommiers
^musique$
^(faq|aide)$
^(file )?loss( )?less$
paris
faq <<< this match twice
我的用例是每个匹配的模式都会显示一个指向我的用户的链接, 所以我可以有多个模式匹配。
我针对一个简单的文本字符串“live in paris”/“faq”/“pom”来测试这些模式...
最简单的方法是用 preg_match
遍历所有模式,但我会在性能关键页面上经常这样做,所以这对我来说很糟糕。
这是我尝试过的:将所有这些表达式与组名组合成一个:
preg_match("@(?P<group1>^(faq|aide|todo|paris)$)|(?P<group2>(paris)$)@im", "paris", $groups);
如您所见,每个模式都被分组:(?P<GROUPNAME>PATTERN)
并且都被管道隔开|
.
结果不是我所期望的,因为只返回第一组匹配。看起来当匹配发生时解析停止。
我想要的是所有匹配组的列表。 preg_match_all
也无济于事。
谢谢!
最佳答案
怎么样:
preg_match("@(?=(?P<group1>^(faq|aide|todo|paris)$))(?=(?P<group2>(paris)$))@im", "paris", $groups);
print_r($groups);
输出:
Array
(
[0] =>
[group1] => paris
[1] => paris
[2] => paris
[group2] => paris
[3] => paris
[4] => paris
)
(?= )
称为 lookahead
正则表达式的解释:
(?= # start lookahead
(?P<group1> # start named group group1
^ # start of string
( # start catpure group #1
faq|aide|todo|paris # match any of faq, aide, todo or paris
) # end capture group #1
$ # end of string
) # end of named group group1
) # end of lookahead
(?= # start lookahead
(?P<group2> # start named group group2
( # start catpure group #2
paris # paris
) # end capture group #2
$ # end of string
) # end of named group group2
) # end of lookahead
关于php - 将多个匹配的正则表达式合并为一个并得到匹配的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16195011/