2014-12-07 92 views
3

我有数据从数据库(非常受控的输入)出来,它们之前和之后都会有下划线。它们存储这样的:PHP中“filter_var”和“preg_replace”之间的后端差异是什么?

_51_ _356_ 

他们不会被存储在任何其他格式,但不会有我需要得到公正的数字从他们的时间。我选择为使用

$x = filter_var($myNumber, FILTER_SANITIZE_NUMBER_INT); 

$y = preg_replace("/[^0-9]/","",$myNumber); 

我不知道在后端2之间的细微差别,但它们都产生我所需要的东西(我是这么认为的,反正​​) ,所以对我来说没关系。使用这些选项的优点和缺点是什么? (例如,是否使用数组或其他奇怪的东西,我可能需要知道?一个使用方式太多的资源?)

+0

尽可能尝试通过正则表达式的人使用字符串函数,即使用str_replace()函数或修剪() – Konstantin 2014-12-07 10:30:19

+2

基准它。这两种解决方案完全不同。 'FILTER_SANITIZE_NUMBER_INT'完全只是它所说的。 'preg'是一个完整的正则表达式引擎,你正在使用一点功能。一个可能比另一个更有效率,但你只能通过基准确认。 – deceze 2014-12-07 10:30:22

+2

在进行基准测试之前,添加量词'+'以获得更高效的模式。 – 2014-12-07 12:36:05

回答

2

那么,你的情况没有太大的区别。我认为preg_replace在资源上更昂贵,因为它必须解析正则表达式模式。

或者您可以使用trim

echo trim('_12_', '_'); 

它会删除“_”在这两个方面,我认为这是最可读的方式去做。

+0

我会研究这个修剪()。我可能只是用它来代替。 – BillyNair 2014-12-09 11:47:36

2

过滤器不使用正则表达式,但以类似的方式工作:遍历字符串字符按char和删除不匹配模式字符:

for (i = 0; i < Z_STRLEN_P(value); i++) { 
    if ((*map)[str[i]]) { 
     buf[c] = str[i]; 
     ++c; 
    } 
} 

@http://lxr.php.net/xref/PHP_5_6/ext/filter/sanitizing_filters.c#filter_map_apply

FILTER_SANITIZE_NUMBER_INT被定义为[^0-9+-]

/* strip everything [^0-9+-] */ 
const unsigned char allowed_list[] = "+-" DIGIT; 
filter_map  map; 

filter_map_init(&map); 
filter_map_update(&map, 1, allowed_list); 
filter_map_apply(value, &map); 

@http://lxr.php.net/xref/PHP_5_6/ext/filter/sanitizing_filters.c#php_filter_number_int

当然,[^0-9+-]是不是一个合适的表情进行筛选整数,因此可以为准备惊喜:

$x = filter_var("+++123---", FILTER_SANITIZE_NUMBER_INT); 
var_dump($x); // WTF? 

我的建议是坚持正则表达式:他们是明确的,比过滤器马车少得多。

1

我想尝试一些这方面的各种方法,所以请设置以下基准。它看起来像你的情况,修剪绝对是最好的选择,因为它只需要查看字符串的开头和结尾,而不是每个字符。这里是我的运行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; 
相关问题