检查变量是否为数字的最佳方法

时间:2012-04-12 05:46:16

标签: php performance numbers

我有一个php脚本,可以从管理员处获取一个号码并更改相关用户。直到我意识到is_numericintval函数有一个有趣的行为才行。这是我使用的代码:

if( ((empty($_GET["uid"]))  || (!isset($_GET["uid"])))){
    $id=0;
}else{
    if(is_numeric($_GET["uid"])){
        $id=intval($_GET["uid"]);
        if($id<0){
            $id=0;
        }
    }else{
        $id=0;
    }
}

但如果我将12er3作为输入发送给脚本,则$id将为12。显然这不是我想要的。我找到了几种检查输入的方法,以确保它包含数字(只有数字): 1:

$id=(filter_var($_GET['uid'],FILTER_VALIDATE_INT)?(intval($_GET['uid'])<0?0:intval($_GET['uid'])):0);

2: This one
3:

preg_match("/^\d+$/",$_GET["uid"])

我的问题是哪种方式更好用?

******
注意:$ id应为非负数和整数。

我没有回答,因为没有人回答我的问题:我一直在寻找最好的方法!

5 个答案:

答案 0 :(得分:2)

使用函数ctype_digit进行检查。

答案 1 :(得分:1)

PHP的is_numeric()行为应该是可预测的,我认为应该可以正常工作。我不明白为什么你需要intval()

[ghoti@pc ~]$ php -r 'if (is_numeric("12er3")) print "yes\n";'
[ghoti@pc ~]$ php -r 'if (is_numeric("123")) print "yes\n";'
yes
[ghoti@pc ~]$ 

一旦确认了变量is_numeric(),就可以按原样使用变量。 PHP是无类型的。

[ghoti@pc ~]$ cat doit.php 
#!/usr/local/bin/php
<?php

$_GET["uid"]=$argv[1];

if (isset($_GET["uid"]) && is_numeric($_GET["uid"])) {
  $a=preg_split('/[^\d]+/', $_GET["uid"]+0);      # Use only the 
  $id=$a[0];                                      # integer part
  if ($id<0) {
    $id=0;
  }
} else {
  $id=0;
}

print $id . "\n";

[ghoti@pc ~]$ ./doit.php 123
123
[ghoti@pc ~]$ ./doit.php 12er3
0
[ghoti@pc ~]$ ./doit.php ""   
0
[ghoti@pc ~]$ ./doit.php   
0
[ghoti@pc ~]$

答案 2 :(得分:0)

有帮助吗?

if (strval(intval($_GET["uid"])) == $_GET["uid"]) {
    // the value is an integer
}

答案 3 :(得分:0)

您可以执行以下操作:

$id = (isset($_GET["uid"]) ? $_GET["uid"] : 0);
if ($id !== strval(intval($id))) {
    $id = 0;
}
$id = max(0, $id);

答案 4 :(得分:0)

哇。我非常喜欢this answer from number 2,我倾向于认为这似乎是过滤掉整数的最有效方法之一。

IE,转而作为参考的例子,感谢Martin Geisler与我们分享:

if (strcspn($_REQUEST['q'], '0123456789') != strlen($_REQUEST['q']))
  echo "true";
else
  echo "false";

即使出于好奇心,我也很想做基准测试。有很多方法可以做到这一点,希望其他人也有想法。

您的第一个方法看起来不错但我认为在某些奇怪的情况下可能会失败。也许没有,我还没有测试过您的代码,但我在考虑$_GET['uid']的值是.+1234.56还是其他一些类似的奇怪案例,你可能会得到意想不到的结果。

您可以轻松地使用您拥有的代码,每个方法在自己的函数中执行几个测试和脚本,并通过调用每个函数1000次来对此进行基准测试,您将立即了解最佳解决方案“性能比较明智的”。结果可能会让你大吃一惊。我可以确保最漂亮的代码并不总是最好!为了表现,我不得不推出一些丑陋的黑客。

只要您的测试非常严格,并根据需要进行更新(非常重要)以反映其正在测试的代码的任何要求,您可以使用您喜欢的任何实现通过我一直在谈论的测试< / em>的。

在这种情况下,要求非常小, test 非常容易。

快乐的编码,欢呼!