PHP检查,看看variables是整数

有没有更好的方法来做到这一点?

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 

但有没有这样做的function?


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

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

注意:我只是想出了我以前的解决scheme,我提出将所有的string返回true。 (谢谢redreggae)

 $var = 'hello'; if( $var != (integer)$var ) echo 'not a integer'; // will return true! So this doesn't work either. 

这不是检查variables是否是PHP中的整数的重复,因为我的整数的要求/定义与theres不同。

尝试ctype_digit

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

注意:它只能使用stringtypes。 所以你必须强制转换string的正常variables:

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

还要注意:它不适用于负整数。 如果你需要这个,你将不得不使用正则expression式。 我发现这个例子:

编辑:感谢LajosVeres,我已经添加了D修饰符。 所以123\n是无效的。

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

更多:简单的testing与铸造将无法正常工作,因为“PHP”== 0是true和“0”=== 0是false ! 查看types比较表 。

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

尝试filter_var函数

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

使用:

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

在PHP $_POST值中总是文本( stringtypes)。

你可以像下面这样强制一个variables:

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

如果你确定$_POST['id'] 应该是一个整数,这将工作。 但是如果你想确保它只包含从09数字,并且没有其他符号或符号使用:

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

检查出来: http : //php.net/manual/en/function.ctype-digit.php – 它validation如果string只包含数字,所以一定不要传递一个int到该函数,因为它很可能会返回false ; 但是,所有来自$_POST值总是string,所以你是安全的。 它也不会validation负数,如-18因为-不是一个数字,但你总是可以做ctype_digit(ltrim($number, '-'))

is_int检查你的情况是string的variablestypes ; 这将是相同的(integer)$v === $v as ==做一些真正的晦涩的事情,以比较两个不同types的variables; 你应该总是使用===除非你想像"0af5gbd" == 0这样的混乱返回true

另外,请记住, ctype_digit不会告诉你该string是否可以实际转换为有效的int因为最大整数值是PHP_INT_MAX ; 如果你的值比这个大,那么你将得到PHP_INT_MAX

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

如果你知道它是一个stringvariables(如post o获取值),你可以使用:

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

使用ctype_digit接受的答案是正确的,但是你可以使用一个函数使生活更轻松。 这将把variables转换为一个string,所以你不必:

 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; } 

使用以下通用function来检查所有types:

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

我用:

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

注意比这只捕获正整数string

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

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

考虑到这个variables数组:

 $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方式):

 # 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 ✔ 

第三种select(CTYPE_DIGIT方式):

 # 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 ✔ 

第四种select(REGEX方式):

 # 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 ✔ 

is_int是完美的工作,不需要额外的代码

或者您可以使用is_numeric进行检查