在PHP中将字符串快速拆分成数组的最快方法

3

我有一个PHP脚本,使用preg_split函数将字符串拆分成数组。preg_split代码如下:

preg_split("~(?<!\*):~", $val);

这个函数实际上是在冒号处分割字符串,但是不包括前面的星号。 例如:"h*:el:lo" 被分割成 array("h*:el", "lo")

当需要分割大量字符串时,这个过程会消耗大量资源并变得很慢。 是否有更快的方法来实现这个功能?


1
你可以使用explode函数将字符串拆分为数组。 - Bhumi Shah
很抱歉,使用正则表达式可能没有更快的替代方法,因为在冒号之前不能有 * 这个条件。否则,您可以尝试使用 explode 函数并比较结果。 - Hanky Panky
我能想到的另一种方法是自己循环字符串并手动构建数组,但这可能比使用 preg 更慢。 - Marc B
@bhumi:一般来说是的,但是explode不支持正则表达式,并且进行盲目的分割。OP希望在分割点中排除*: - Marc B
@MarcB - 我可以确认字符串循环要慢大约10倍。 - Álvaro González
2个回答

1
你可以尝试类似这样的代码:

你可以尝试类似这样的代码:

$string = "h*:el:lo";
$string = str_replace("*:", "#", $string);
$array = explode(":", $string);

我不确定速度会如何,但一旦你从字符串中移除 *: 位,就很容易进行分割。如果需要,操作后可以重新加上 *:。


我还没有进行彻底的测试,但是似乎即使使用array_map(),获取*:也非常缓慢。 - Álvaro González
也许这并不是必需的,除非是为了显示目的。我有一个想法,后面会在我的帖子上进行编辑。 - Husman
现在不需要再把 * 放回去了。我们在分割之前将它们保留在原地。 - Husman
2
现在你的代码运行更快了,因为它不再遵循规范。 - Álvaro González
你是如何测试脚本的时间性能的? - Husman
显示剩余2条评论

0
你需要使用 preg_split() 吗?因为使用 preg_match_all() 更容易:
preg_match_all('/(?:^|:)([^*:]+(?:\*.[^*:]+)*)/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[1];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接