preg_match() 和 preg_replace() 慢吗?

我已经用PHP编码了一段时间,我一直在阅读你应该只使用,当你必须使用时,因为它会降低性能。这是为什么呢?在一个文件中使用20而不是使用另一个PHP函数真的不好吗?preg_matchpreg_replacepreg_matches


答案 1

正如迈克·布兰特(Mike Brant)在他的回答中所说:如果你需要的话,使用任何功能都没有错。
你想知道在一个文件中有20个电话是否是一个好主意,嗯,老实说:我会说这太多了。我经常说,“如果你对一个问题的解决方案在任何给定时间依赖于3个以上的正则表达式,那么你就是问题的一部分”。不过,我偶尔会得罪自己的咒语。preg_*preg_match

如果您使用20个调用,则只需仔细查看实际的正则表达式,就可以将该数字减半。正则表达式,尤其是Perl正则表达式,非常强大,非常值得花时间去了解它们。它们往往较慢的原因仅仅是因为正则表达式必须被解析,并在某个低级别“转换”到相当数量的分支和循环。例如,如果你想用大写字符替换所有小写的's,你可以使用正则表达式,当然,但在PHP中,这看起来像这样:preg_matcha

preg_replace('/a/','A',$string);

看看表达式,第一个参数:它是作为参数传递的字符串。将解析此字符串(解析时,检查分隔符,创建匹配字符串,然后迭代字符串,将每个字符与模式进行比较(在本例中),如果子字符串匹配,则替换它。
似乎有点匆忙,特别是考虑到最后一步(比较子字符串和替换匹配项)是我们真正想要的。a

$string = str_replace('a','A',$string);

就是这样做的,而无需在解析和验证正则表达式时执行其他检查。
不要忘记,它也构造一个匹配数组,并且构造数组也不是免费的。preg_match

简而言之:正则表达式的速度较慢,因为表达式被解析,验证并最终转换为一组简单的低级指令。

请注意,在某些情况下,人们使用 和 进行字符串操作。这也创建了一个数组,它再次不是免费的。考虑到不久之后你正在内爆同一个数组。也许另一种选择更可取(在某些情况下,这里可以更快)。
基本上:正则表达式需要额外的处理,简单的字符串函数不需要。但是,当有疑问时,只有一种方法可以绝对确定:设置测试脚本...explodeimplodepreg_replace


答案 2

不要担心优化,除非你有问题。

不要在没有使用XDebug(http://xdebug.org)之类的东西进行测量的情况下寻找优化区域。

如果你的代码需要100毫秒才能运行preg_match()和110毫秒,通过其他方法,你真的关心区别吗?

首先写正确性和清晰度,然后考虑速度。


推荐