说我有abcdeXqwerXiop
(编辑:我们知道有Xs)我想回来abcdeXqwer
- 在X
的最后一次出现时切断字符串(不包括最后一个字符)。最快的方法是什么?我最好的想法是
preg_replace('/.[^X]+$/', '', $string);
答案 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跟踪了这个结果并且结果一致。