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 }
注意:它只能使用string
types。 所以你必须强制转换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
值中总是文本( string
types)。
你可以像下面这样强制一个variables:
$int_id = (int)$_POST['id'];
如果你确定$_POST['id']
应该是一个整数,这将工作。 但是如果你想确保它只包含从0
到9
数字,并且没有其他符号或符号使用:
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进行检查