Jas*_*oyn 10 php regex optimization preg-replace preg-match
我已经在PHP编写了一段时间,我一直在阅读你应该只使用preg_match和preg_replace必须使用,因为它会降低性能.为什么是这样?preg_matches在一个文件中使用20 而不是使用另一个PHP函数真的很糟糕.
Eli*_*gem 15
正如迈克布兰特在他的回答中所说:如果你需要它们,使用任何preg_*功能都没有错.
你想知道在一个文件中有20个调用是否是一个好主意,老实说:我会说这太多了.我经常说"如果你的问题解决方案在任何给定的时间都依赖于超过3个正则表达式,那么你就是问题的一部分".不过,我偶尔会犯下自己的口头禅.preg_match
如果你正在使用20个preg_match电话,那么你可以通过仔细查看实际正则表达式来将这个数字减半.正则表达式,特别是Perl正则表达式,非常强大,非常值得花时间去了解它们.究其原因,为什么他们往往要慢一些很简单,因为正则表达式必须解析,"翻译"到了相当数量的树枝,在一些低层次循环.例如,如果你想a用大写字母替换所有小写字母,你肯定可以使用正则表达式,但在PHP中,它看起来像这样:
preg_replace('/a/','A',$string);
Run Code Online (Sandbox Code Playgroud)
查看表达式,第一个参数:它是一个作为参数传递的字符串.将解析此字符串(解析时,检查分隔符,创建匹配字符串,然后迭代字符串,将每个字符与模式进行比较(在本例中a),如果子字符串匹配,则替换它.
似乎像有点匆忙,特别是考虑到最后一步(比较子串和替换匹配)是我们真正想要的.
$string = str_replace('a','A',$string);
Run Code Online (Sandbox Code Playgroud)
就是这样,在解析和验证正则表达式时不执行额外的检查.
不要忘记它preg_match也构造了一个匹配数组,并且构造一个数组也不是免费的.
简而言之:正则表达式较慢,因为表达式被解析,验证并最终转换为一组简单的低级指令.
请注意,在某些情况下,人们使用explode和implode进行字符串操作.这也创造了一个阵列,它不是自由的.考虑到你之后不久会爆发同样的阵列.也许另一种选择更令人满意(在某些情况下preg_replace 可以更快).
基本上:正则表达式需要额外的处理,简单的字符串函数不需要.但是当有疑问时,只有一种方法可以绝对确定:设置测试脚本......
除非遇到问题,否则不要担心优化问题.
如果不使用XDebug(http://xdebug.org)之类的东西进行测量,请不要寻找优化领域.
如果您的代码需要100毫秒才能运行preg_match()和110毫秒通过其他方法运行,您真的关心差异吗?
首先写正确性和清晰度,然后考虑速度.
这真的取决于你的用例.使用正则表达式没有任何固有的"坏处".有时它是您解决特定问题的唯一解决方案.但是,有时简单的字符串操作函数可以正常工作.这些往往比preg*函数更快,因此如果遇到脚本运行非常频繁和/或要执行大量字符串操作的情况,可以开始感受到使用正则表达式的影响.
与任何事情一样,您应该在您的应用程序和环境中进行测试,并确定最适合您的方法.