如果$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)
答案 0 :(得分:1)
如果有一种方法可以在一个正则表达式模式中执行它们,那么它肯定更快(即使在某些情况下它可能不明显)。但是,我想说在某些情况下,您可能希望为自己和其他代码审阅者分离验证模式。
如果你对正则表达式有很强的理解,这可能不是问题,但有时候分开看看哪个特定的验证失败是很好的。这也允许您报告这些不同的方案。
但严重的是 - 没有什么比解决所有验证需求的正则表达式更糟糕了。
答案 1 :(得分:0)
如果正则表达式引擎代码好的话,我会说带分支的单个正则表达式几乎总是更快。好吧,我不保证PHP的正则表达式引擎。但是,一些正则表达式引擎(不是PHP)构建了一个包含所有可能状态转换的表(确定性有限自动机);他们只需要扫描字符串中的每个字符一次,无论正则表达式有多复杂,扫描速度都快,执行时间仅取决于字符串的长度。
此外,有可能同时证明所有分支错误;假设您的模式为abc|def|ghi
并且您遇到了字符x
,则此时不会发生任何匹配。