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

2022-08-30 21:54:59

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

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

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

将第 9 个字节解析为一个数据片段,直到下一个“000000”。然后抓住接下来的19个字节,并将其拆分为8(抛掷1)和8。然后我做一些其他的事情,将这两个8字节的字符串转换为日期。

这就是我需要做的事情。


答案 1

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

我还没有分析正则表达式,所以我不能说它们在运行时会更快,但我可以告诉你,使用基本函数将等效项放在一起所花费的额外时间是不值得的。


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

听起来好像你实际上需要在这里做一些小的字符串操作。由于每个步骤都非常基本,并且我怀疑您是否能够使用正则表达式一次完成所有这些步骤(甚至其中的几个步骤),因此我会使用基本函数:

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

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

然后抓住接下来的19个字节,并将其拆分为8(抛掷1)和8。

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

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

答案 2

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

编辑:对于您发布的这个特定问题,我会偏爱字符串操作,但只是因为我不知道如何在正则表达式中执行此操作。除了哈希之外,这似乎非常简单,所以我认为正则表达式/字符串函数不会有太大的区别。


推荐