preg_match()和preg_replace()是否慢?

时间:2013-01-15 16:39:13

标签: php regex optimization preg-replace preg-match

我已经在PHP编写了一段时间,我一直在阅读,你必须在必要时使用preg_matchpreg_replace因为它会降低性能。为什么是这样?在一个文件中使用20 preg_matches而不是使用另一个PHP函数真的很糟糕。

6 个答案:

答案 0 :(得分:14)

正如Mike Brant在回答中所说:使用任何preg_*函数没有任何问题,如果你需要它们。
你想知道在一个文件中有20个preg_match调用是否是个好主意,老实说:我会说这太多了。我经常说“如果你的问题解决方案在任何给定的时间依赖于超过3个正则表达式,那么你就是问题的一部分”。不过,我偶尔会犯下自己的口头禅。

如果 使用20个preg_match来电,那么您可以通过仔细查看实际正则表达式来将该数字减半。正则表达式,特别是Perl正则表达式,非常强大,非常值得花时间去了解它们。 为什么它们往往更慢的原因仅仅是因为正则表达式必须被解析,并且“翻译”到相当多的分支和循环处于某种低级别。例如,如果你想用大写字母替换所有小写a,你肯定可以使用正则表达式,但在PHP中,它看起来像这样:

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

查看表达式,第一个参数:它是一个作为参数传递的字符串。将解析此字符串(解析时,检查分隔符,创建匹配字符串,然后迭代字符串,将每个字符与模式进行比较(在本例中为a), if < / em>子串匹配,它被替换。
看起来有点像一个任务,特别是考虑到最后一步(比较子串和替换匹配)是我们真正想要的。

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

就是这样,在解析和验证正则表达式时不执行额外的检查 不要忘记preg_match也构造了一个匹配数组,构造数组也不是免费的。

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

请注意,在某些情况下,人们会使用explodeimplode进行字符串操作。这也创造了一个阵列,它不是自由的。考虑到你之后不久会爆发同样的阵列。也许另一种选择更合适(在某些情况下preg_replace 可以更快。
基本上:正则表达式需要额外的处理,简单的字符串函数不需要。但是当有疑问时,只有一种方法可以绝对确定:设置测试脚本......

答案 1 :(得分:7)

除非遇到问题,否则不要担心优化。

如果不使用XDebug(http://xdebug.org)等测量,请不要寻找优化领域。

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

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

答案 2 :(得分:6)

这实际上取决于您的使用案例。使用正则表达式没有任何固有的“坏处”。有时它是您解决特定问题的唯一解决方案。但是,有时简单的字符串操作函数可以正常工作。这些往往比preg*函数更快,所以如果遇到脚本运行非常频繁和/或要执行大量字符串操作的情况,使用正则表达式的影响可以开始感受到了。

与任何事情一样,您应该在您的应用程序和环境中进行测试,并确定哪种方法最适合您。

答案 3 :(得分:4)

检查所需的时间( STARTED ENDED 时的显示时间):

var_dump( microtime(true) );

//...............  your function executions here.............

var_dump( microtime(true) );

答案 4 :(得分:2)

取决于你在做什么。对于复杂的正则表达式,只需使用preg_函数,如果需要简单的替换或类似,请使用其他更具体的函数,如str_replace(),strpos(),strstr()......

网络上充满了讨论,例如http://www.simplemachines.org/community/index.php?topic=175031.0

答案 5 :(得分:0)

对于短字符串(例如少于几千字节),性能差异可以忽略不计。对于长字符串,例如超过30-50 kB(通常为WYSIWYG内容)的性能差异变得尤为明显,尤其是对于贪婪的变体-例如preg_match_all。因此,对于长字符串,使用简单的字符串迭代/查找通常会更快,例如str_pos()提取并用substr()提取或替换部分字符串,然后仅应用preg_ *函数-用于提取的短字符串。