preg_match()和preg_replace()慢吗?

问题描述 投票:10回答:6

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

php regex optimization preg-replace preg-match
6个回答
15
投票

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

如果您are使用20个preg_match调用,则可以通过仔细查看实际的正则表达式将数字减少一半。正则表达式,尤其是Perl正则表达式,功能强大,非常值得花时间来了解它们。它们趋向于变慢的原因仅是因为必须对正则表达式进行解析,然后将其“转换”为一定数量的低级分支和循环。例如,如果要用大写字符替换所有小写a,则可以使用正则表达式,但是在PHP中,它看起来像这样:preg_replace('/a/','A',$string);

查看表达式,第一个参数:这是一个作为参数传递的字符串。该字符串将被解析(在解析时,检查定界符,创建匹配字符串,然后迭代该字符串,将每个字符与模式进行比较(在这种情况下为a),并在子字符串

if

匹配,将其替换。似乎有点麻烦,尤其是考虑到我们真正想要的就是最后一步(比较子字符串和替换匹配项)。 $string = str_replace('a','A',$string);
只是这样做,在解析和验证正则表达式时无需执行其他检查。不要忘记preg_match还会构造一个匹配数组,而且构造一个数组也不是免费的。 

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

注意,在某些情况下,人们使用explodeimplode进行字符串操作。同样,这也会创建一个数组-再次-不是免费的。考虑到此后不久您将内陷于同一阵列。也许更希望有另一个选择(在某些情况下preg_replace

can

更快)。基本上:正则表达式需要其他处理,而简单的字符串函数则不需要。但是,如果有疑问,只有一种方法可以绝对确定:设置测试脚本...

8
投票
除非有问题,否则不要担心优化。

6
投票
这实际上取决于您的用例。使用正则表达式没有天生的“坏”之处。有时,这是解决特定问题的唯一可用方法。但是,有时候简单的字符串操作功能会很好地工作。它们往往比preg*函数要快,因此,如果遇到脚本运行得非常频繁和/或要执行大量字符串操作的情况,使用正则表达式的影响可能会开始感到。

4
投票
检查需要多少时间(

STARTED


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

0
投票
就我而言,这非常有用,因为在渲染页面之前我使用了大约30多个preg_replace()。我设法缓存了页面,因此不必总是进行迭代。
© www.soinside.com 2019 - 2024. All rights reserved.