php - 将多个匹配的正则表达式合并为一个并得到匹配的

标签 php regex preg-match

我有一个正则表达式列表:

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/

相关文章:

php - 使用引号保存到 MySQL 序列化信息

php - 具有挑战性的 SQL 查询

javascript - 产品过滤 PHP

php - 正则表达式删除所有空的 HTML 标签

regex - 有用的正则表达式教程

php - 正则表达式替换周围的字符,同时保留之间的字符串

javascript - 如何将字符串拆分为段落?

php - 从 PHP 循环创建两个主列

regex - 在 htaccess 中重写以匹配某些文件扩展名

php - preg_match() : Compilation failed: invalid range in character class at offset