在char之后删除所有东西的最快PCRE是什么?

时间:2013-08-07 01:41:35

标签: regex pcre

说我有abcdeXqwerXiop(编辑:我们知道有Xs)我想回来abcdeXqwer - 在X的最后一次出现时切断字符串(不包括最后一个字符)。最快的方法是什么?我最好的想法是

preg_replace('/.[^X]+$/', '', $string);

3 个答案:

答案 0 :(得分:0)

最快的方法是完全跳过正则表达式:

substr($string, 0, strrpos($string, "X") + 1);

答案 1 :(得分:0)

为什么正则表达式?这会快得多。

substr($string, 0, strrpos($string, 'X'));

答案 2 :(得分:0)

tl;博士:我不像我想的那样知道微优化 - 但是没有人愿意提供证据。

没有证据表明两个函数调用是否比一个快。所以,这是一个脚本:

$string = str_repeat('abcdeXqwerXiopreyX', 50) . 'aaaaaaa';
function test($string) {
  for ($i = 0; $i < 10000; $i++) preg_replace('/X[^X]+$/', '', $string);
}
function test1($string) {
  for ($i = 0; $i < 10000; $i++) substr($string, 0, strrpos($string, 'X') + 1);
}
test($string);
test1($string);

然后我运行php -d xdebug.auto_trace=1 test.php以找到脚本在0.0004输入test(),在0.683输入test1() 0.3430结束。因此test()需要.3426而test1()需要0.2652。

我们可以同意,这两个电话确实更快。

但是,如果我们想坚持正则表达式,那么提供“X [^ X] + $'更快但没有证据。我找到了调试它们的方法。 PHP不能不用Perl。

所以,

$string = 'abcdeXqwerXiop';
$string =~ s/X[^X]+$//;
print $string;

然后运行perl -Mre=debug test.pl。粘贴此处太长了,但此脚本的输出长度为27行,而.[^X]+$确实需要75行,是找到匹配项的几倍。

编辑:这个可能是不正确的,因为PCRE和Perl是不同的实现,可能有不同的优化,但我也用xdebug跟踪了这个结果并且结果一致。