我想尝试一些这方面的各种方法,所以请设置以下基准。它看起来像你的情况,修剪绝对是最好的选择,因为它只需要查看字符串的开头和结尾,而不是每个字符。这里是我的运行PHP 7.0.18下划线的10,000,000个随机整数的测试结果。
preg_replace:1.9469740390778秒。
filter_var:1.6922700405121秒。
str_replace:0.72129797935486秒。
trim:0.37275195121765秒。
这里是我的代码,如果有人想进行类似的测试:
<?php
$ints = array();//array_fill(0, 10000000, '_1029384756_');
for($i = 0; $i < 10000000; $i++) {
$ints[] = '_'.mt_rand().'_';
}
$start = microtime(true);
foreach($ints as $v) {
preg_replace('/[^0-9]/', '', $v);
}
$end = microtime(true);
echo 'preg_replace in '.($end-$start).' seconds.',PHP_EOL;
$start = microtime(true);
foreach($ints as $v) {
filter_var($v, FILTER_SANITIZE_NUMBER_INT);
}
$end = microtime(true);
echo 'filter_var in '.($end-$start).' seconds.',PHP_EOL;
$start = microtime(true);
foreach($ints as $v) {
str_replace('_', '', $v);
}
$end = microtime(true);
echo 'str_replace in '.($end-$start).' seconds.',PHP_EOL;
$start = microtime(true);
foreach($ints as $v) {
trim($v, '_');
}
$end = microtime(true);
echo 'trim in '.($end-$start).' seconds.',PHP_EOL;
尽可能尝试通过正则表达式的人使用字符串函数,即使用str_replace()函数或修剪() – Konstantin 2014-12-07 10:30:19
基准它。这两种解决方案完全不同。 'FILTER_SANITIZE_NUMBER_INT'完全只是它所说的。 'preg'是一个完整的正则表达式引擎,你正在使用一点功能。一个可能比另一个更有效率,但你只能通过基准确认。 – deceze 2014-12-07 10:30:22
在进行基准测试之前,添加量词'+'以获得更高效的模式。 – 2014-12-07 12:36:05