1

如果我的$contents 来自具有不同模式的不同来源,我是否应该制作一种适合所有人的模式并且只做一种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)

?

4

2 回答 2

1

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

如果您对正则表达式有深入的了解,这可能不是问题,但有时最好分开看看哪个特定验证失败。这也允许您针对这些不同的场景进行报告。

但说真的——没有什么比编写一个解决所有验证需求的正则表达式更糟糕的了。

于 2013-07-31T02:48:28.507 回答
0

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

此外,有可能同时证明所有分支都是错误的;假设您的模式是abc|def|ghi并且您遇到了 character x,那么此时任何这些都不会发生匹配。

于 2013-07-31T02:49:44.953 回答