php检查变量是否为整数

时间:2013-10-07 22:16:37

标签: php html validation

有更好的方法吗?

if( $_POST['id'] != (integer)$_POST['id'] )
    echo 'not a integer';

我试过

if( !is_int($_POST['id']) )

但是is_int()由于某种原因不起作用。

我的表单看起来像这样

<form method="post">
   <input type="text" name="id">
</form>

我研究过is_int(),似乎是

is_int('23'); // would return false (not what I want)
is_int(23);   // would return true

我也试过is_numeric()

is_numeric('23'); // return true
is_numeric(23); // return true
is_numeric('23.3'); // also returns true (not what I want)

似乎这样做的唯一方法是: [这是一种不好的方式,不要这样做,请参阅下面的注释]

if( '23' == (integer)'23' ) // return true
if( 23 == (integer)23 ) // return true
if( 23.3 == (integer)23.3 ) // return false
if( '23.3' == (integer)'23.3') // return false

但是有没有上述功能呢?


为了澄清,我想要以下结果

23     // return true
'23'   // return true
22.3   // return false
'23.3' // return false

注意:我刚刚发现我之前提出的解决方案将为所有字符串返回true。 (感谢redreggae)

$var = 'hello';
if( $var != (integer)$var )
    echo 'not a integer';

// will return true! So this doesn't work either.

这不是Checking if a variable is an integer in PHP的副本,因为我的整数要求/定义与theres不同。

12 个答案:

答案 0 :(得分:53)

尝试ctype_digit

if (!ctype_digit($_POST['id'])) {
    // contains non numeric characters
}

注意:它仅适用于string类型。所以你必须转换为string你的正常变量:

$var = 42;
$is_digit = ctype_digit((string)$var);

另请注意:它不适用于负整数。如果你需要这个,你必须使用正则表达式。我找到this例如:

编辑:感谢LajosVeres,我添加了D修饰符。因此123\n无效。

if (preg_match("/^-?[1-9][0-9]*$/D", $_POST['id'])) {
    echo 'String is a positive or negative integer.';
}

更多:使用强制转换的简单测试不起作用,因为“php”== 0是true而“0”=== 0是false! 请参阅types comparisons table

$var = 'php';
var_dump($var != (int)$var); // false

$var = '0';
var_dump($var !== (int)$var); // true

答案 1 :(得分:15)

尝试filter_var功能

filter_var($_POST['id'], FILTER_VALIDATE_INT);

使用:

if(filter_var($_POST['id'], FILTER_VALIDATE_INT)) { 
    //Doing somethings...

}

答案 2 :(得分:8)

在PHP $_POST中,值始终是文本(string类型)。

您可以将变量强制转换为整数类型,如下所示:

$int_id = (int)$_POST['id'];

如果您确定$_POST['id'] 应该一个整数,那么这将有效。但是,如果您想要确保它只包含09中的数字,并且没有其他符号或符号使用:

if( ctype_digit( $_POST['id'] ) )
{
  $int_id = (int)$_POST['id'];
}

答案 3 :(得分:2)

检查出来:http://php.net/manual/en/function.ctype-digit.php - 它验证字符串是否只包含数字,所以一定不要将int传递给该函数,因为它很可能会返回false;但是,来自$_POST的所有值都是字符串,因此您是安全的。此外,它不会验证负数,例如-18,因为-不是数字,但您始终可以ctype_digit(ltrim($number, '-'))

is_int检查变量类型,在您的情况下为string;它与(integer)$v === $v相同,因为==做了一些真实的模糊事物,以便比较不同类型的两个变量;你应该总是使用===,除非你想要"0af5gbd" == 0之类的混乱才能返回真实的

另外,请记住,ctype_digit不会告诉您字符串是否可以实际转换为有效int,因为最大整数值为PHP_INT_MAX;如果您的值大于此值,则无论如何都会得到PHP_INT_MAX

答案 4 :(得分:2)

preg_match('/^\d+$/D',$variable) //edit 

答案 5 :(得分:1)

如果你知道它是一个字符串变量(比如post o get values),你可以使用:

function is_really_integer($var) {
  return $var == (string)(integer)$var;
}

答案 6 :(得分:1)

使用ctype_digit接受的答案是正确的,但是您可以使用函数让生活更轻松。这会将变量转换为字符串,因此您不必:

function is_num($x){
    if(!is_string($x)){
        $x=(string)$x;
    }
    if(ctype_digit($x)){
      return true;
    }
    return false;
}

用法:

if (is_num(56)) {
    // its a number
}

if (is_num('56')) {
    // its a number
}

如果您也想接受小数,请使用:

function is_num($x){
    if(!is_string($x)){
        $x=(string)$x;
    }    
    if (strpos($x,'.')!==false) {      
        if(substr_count($x,'.')>1||strpos($x,'.')<1||strpos($x,'.')>=strlen($x)){
            return false;    
        }
        $x=str_replace('.','',$x);    
    }
    if(ctype_digit($x)){
        return true;
    }  
    return false;
}

答案 7 :(得分:1)

使用is_numeric()检查变量是否为整数是一个坏主意。 例如,此函数将为TRUE发送3.14。这不是预期的行为

要正确执行此操作,您可以使用以下选项之一:

考虑这个变量数组:

$variables = [
    "TEST 0" => 0,
    "TEST 1" => 42,
    "TEST 2" => 4.2,
    "TEST 3" => .42,
    "TEST 4" => 42.,
    "TEST 5" => "42",
    "TEST 6" => "a42",
    "TEST 7" => "42a",
    "TEST 8" => 0x24,
    "TEST 9" => 1337e0
];

第一个选项(FILTER_VALIDATE_INT方式):

# Check if your variable is an integer
if( ! filter_var($variable, FILTER_VALIDATE_INT) ){
  echo "Your variable is not an integer";
}

输出:

TEST 0 : 0 (type:integer) is not an integer ✘
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

第二个选项(CASTING COMPARISON Way):

# Check if your variable is an integer
if ( strval($variable) != strval(intval($variable)) ) {
  echo "Your variable is not an integer";
}

输出:

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

第三个选项(CTYPE_DIGIT Way):

# Check if your variable is an integer
if( ! ctype_digit(strval($variable)) ){
  echo "Your variable is not an integer";
}

输出:

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

第四个选项(REGEX Way):

# Check if your variable is an integer
if( ! preg_match('/^\d+$/', $variable) ){
  echo "Your variable is not an integer";
}

输出:

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

答案 8 :(得分:1)

使用 filter_var ,但要小心,它会返回bool。

如果您使用字符串'0'=>,则将得到假

正确的使用方式:

if (filter_var($_POST['id'], FILTER_VALIDATE_INT) !== false) { 
    // Doing somethings...
}

答案 9 :(得分:0)

使用以下通用功能检查所有类型:

function is_digit($mixed) {
    if(is_int($mixed)) {
        return true;
    } elseif(is_string($mixed)) {
        return ctype_digit($mixed);
    }

    return false;
}

答案 10 :(得分:0)

我用:

is_int($val)||ctype_digit($val)

注意比这只捕获正整数字符串

答案 11 :(得分:0)

is_int完全正常工作,不需要额外的代码

或者您可以使用is_numeric

进行检查