使用preg_match时,“一种适合所有人的模式”总是比几种模式更好吗?

时间:2013-07-31 02:42:33

标签: php regex preg-match

如果$content来自具有不同模式的不同来源,我应该制作一个适合所有模式的模式,只做一个preg_match

if (preg_match('#^(pattern_a)|(pattern_b)|(pattern_c)$#', $content, $matches) {
    if ($matches[1]) {
        // return sth
    }
    if ($matched[2]) {
        // return sth
    }
    if ($matched[3]) {
        // return sth
    }
}

或者我应该单独解析它们:

if (preg_match('#^pattern_a$#', $content, $matches) {
    // return sth
} 
if (preg_match('#^pattern_b$#', $content, $matches) {
    // return sth
} 
if (preg_match('#^pattern_c$#', $content, $matches) {
    // return sth
}

正在做

(preg_match('#^(pattern_a)|(pattern_b)|(pattern_c)$#', $content, $matches)

慢于

(preg_match('#^pattern_a$#', $content, $matches)

2 个答案:

答案 0 :(得分:1)

如果有一种方法可以在一个正则表达式模式中执行它们,那么它肯定更快(即使在某些情况下它可能不明显)。但是,我想说在某些情况下,您可能希望为自己和其他代码审阅者分离验证模式。

如果你对正则表达式有很强的理解,这可能不是问题,但有时候分开看看哪个特定的验证失败是很好的。这也允许您报告这些不同的方案。

但严重的是 - 没有什么比解决所有验证需求的正则表达式更糟糕了。

答案 1 :(得分:0)

如果正则表达式引擎代码好的话,我会说带分支的单个正则表达式几乎总是更快。好吧,我不保证PHP的正则表达式引擎。但是,一些正则表达式引擎(不是PHP)构建了一个包含所有可能状态转换的表(确定性有限自动机);他们只需要扫描字符串中的每个字符一次,无论正则表达式有多复杂,扫描速度都快,执行时间仅取决于字符串的长度。

此外,有可能同时证明所有分支错误;假设您的模式为abc|def|ghi并且您遇到了字符x,则此时不会发生任何匹配。