我已经在PHP编写了一段时间,我一直在阅读,你必须在必要时使用preg_match
和preg_replace
因为它会降低性能。为什么是这样?在一个文件中使用20 preg_matches
而不是使用另一个PHP函数真的很糟糕。
答案 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
也构造了一个匹配数组,构造数组也不是免费的。
简而言之:正则表达式较慢,因为表达式已经过解析,验证并最终转换为一组简单的低级指令。
请注意,在某些情况下,人们会使用explode
和implode
进行字符串操作。这也创造了一个阵列,它不是自由的。考虑到你之后不久会爆发同样的阵列。也许另一种选择更合适(在某些情况下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_ *函数-用于提取的短字符串。