哪个更有效,PHP字符串函数或PHP中的正则表达式?

时间:2009-03-11 14:14:17

标签: php regex string performance

我正在编写PHP代码来解析字符串。它需要尽可能快,正则表达式是如何去的?我有一种预感,PHP字符串函数更昂贵,但它只是猜测。真相是什么?

以下是我需要对字符串执行的操作:

抓住前半部分(基于子字符串“000000”的第三个位置)并将其散列与接下来的20个字节进行比较,丢弃剩下的任何内容。

将第9个字节解析为下一个“000000”作为一个数据。然后在那之后抓取接下来的19个字节,并将其拆分为8(折腾1)和8.然后我做一些其他的东西,将这两个8字节的字符串转换为日期。

这就是我需要做的事情。

8 个答案:

答案 0 :(得分:16)

这取决于你的情况:如果你正在尝试做一些相当基本的事情(例如:搜索一个字符串,用其他东西替换一个子字符串),那么常规字符串函数就是这样。如果你想做一些更复杂的事情(例如:搜索IP地址),那么正则表达式函数肯定是更好的选择。

我没有描述正则表达式,所以我不能说它们在运行时会更快,但我可以告诉你,使用基本函数将相当于时间花在一起的额外时间是不值得的。< / p>


使用OP中的新信息进行编辑:

听起来好像你真的需要在这里做一些小的字符串操作。因为每一个都是非常基本的,我怀疑你能够使用正则表达式一次完成所有这些步骤(甚至几个步骤),我会使用基本功能:

  

抓住前半部分(基于子字符串“000000”的第三个位置)并将其散列与接下来的20个字节进行比较,丢弃剩下的任何内容。

使用:strpos()substr()
或者:/$(.*?0{6}.*?0{6}.*?)0{6}/

  

然后在之后抓取接下来的19个字节,并将其分成8(折腾1)和8。

使用:substr() - (我假设你的意思是17字节 - 8 + 1 + 8)

$part1 = substr($myStr, $currPos, 8);
$part2 = substr($myStr, $currPos + 9, 8);

答案 1 :(得分:6)

我相信有一个阈值,正则表达式比一堆PHP字符串函数调用更快。无论如何,取决于你正在做什么。你必须找出平衡点。

现在您已编辑了问题。我会使用字符串函数来完成你想要完成的任务。 strpos()和substr()是第一眼就能想到的。

答案 2 :(得分:6)

我认为如果你想要最高的性能,你应该避免正则表达式,因为它有助于最小化工作量,但不会有最佳性能,因为你几乎总能使用字符串例程调整代码以解决特定问题并获得巨大的性能提升它的。但是对于无法进行优化的简单解析例程,您仍然可以使用正则表达式,因为它不会在那里产生很大的不同。

编辑:对于你发布的这个特定问题,我赞成字符串操作,但仅仅因为我不知道如何在正则表达式中做到这一点。这似乎是非常简单的,除了哈希,所以我认为正则表达式/字符串函数不会产生很大的不同。

答案 3 :(得分:4)

如果你正在做的事情完全合理地使用字符串函数,你应该使用它们。例如,如果您确定'abc'中是否出现常量字符串$value,您肯定要检查strpos($value, 'abc') !== false,而不是preg_match('/abc/', $value)。但是,如果你发现自己正在进行大量的字符串重组和转换以完成你使用正则表达式所做的事情,那么你几乎肯定会破坏性能和可维护性。

当关注速度时,当它归结为它时,不要考虑它,计时。 time命令是你的朋友。

答案 4 :(得分:4)

通常,字符串函数更快,正则表达式函数更灵活。

与其他任何事情一样,您的结果可能会有所不同,唯一可以确定的方法是尝试两种方式和基准。

答案 5 :(得分:2)

我同意所有人的观点:字符串函数比正则表达式函数更高效。我只是想展示一个小测试,我在终端做了一个证明:

<强> strpos()

$ time php -r '$i = 0; while($i++ < 1000000) strpos("abc", "a");'

real    0m0.380s
user    0m0.368s
sys    0m0.008s

<强>的preg_match()

$ time php -r '$i = 0; while($i++ < 1000000) preg_match("/abc/", "a");'

real    0m0.441s
user    0m0.432s
sys    0m0.004s

答案 6 :(得分:1)

本机字符串函数更快。正则表达式的好处是你可以用它们做任何事情。

答案 7 :(得分:0)

取决于您的需求。大多数正则表达式操作比人们想象的要快,甚至可以在某些简单的操作中胜过内置字符串函数。请注意,我考虑了preg库,而不是内置的正则表达式库,这非常慢。