我一直试图想一个可以用来检查变量值的函数,如果它是base10中的整数,无论是整数还是字符串的类型。它主要用于检查POST值,主要由AJAX生成(可以轻松由用户修改)。
谷歌搜索不会产生相对结果(对我来说),或者我不知道"正确"要搜索的短语。
当前内置插件的问题是,它们都需要额外检查,因为它们会泄漏" 以某种方式,只允许使用base10整数。例如,filter_var
FILTER_VALIDATE_INT
通过" 123" (注意结尾处的空格)。
我自己提出了两个功能,我也会问你的意见,你对它们的看法。它们是否像我认为的那样可靠?我应该使用哪一种,或者你知道更好的东西吗?
function myIsInt1($value)
{
if(is_int($value))return true;
if(is_float($value))return ($value===(float)(int)$value);
if(!is_string($value))return false;
return ($value===(string)(int)$value);
}
和
function myIsInt2($value)
{
/* this wont work as supposed to, because it allows overflowing integers */
if(is_int($value))return true;
if(is_float($value))return ($value===(float)(int)$value);
if(!is_string($value))return false;
return !!preg_match('/^(0|\-?[1-9][0-9]*)$/',$value);
}
两者都需要检查{p> is_string()
,否则第一个函数会给出误报,第二个函数会产生警告。功能的目的是验证,可能的类型 - 杂耍在其他地方完成。
一些测试结果:
$values = array(
'-0',
-0,
0,
123,
-123,
'123',
'-123',
'0123',
'123 ',
'0',
'000',
'+123',
'1.23',
1.23,
'123e4',
'0x123',
'potato',
'EEBD',
true,
false,
null,
'10000000000000000000',
10000000000000000000
);
PHP version: 5.4.30
string(2) "-0" = bool(false) bool(false)
int(0) = bool(true) bool(true)
int(0) = bool(true) bool(true)
int(123) = bool(true) bool(true)
int(-123) = bool(true) bool(true)
string(3) "123" = bool(true) bool(true)
string(4) "-123" = bool(true) bool(true)
string(4) "0123" = bool(false) bool(false)
string(4) "123 " = bool(false) bool(false)
string(1) "0" = bool(true) bool(true)
string(3) "000" = bool(false) bool(false)
string(4) "+123" = bool(false) bool(false)
string(4) "1.23" = bool(false) bool(false)
float(1.23) = bool(false) bool(false)
float(2) = bool(true) bool(true)
string(5) "123e4" = bool(false) bool(false)
string(5) "0x123" = bool(false) bool(false)
string(6) "potato" = bool(false) bool(false)
string(4) "EEBD" = bool(false) bool(false)
bool(true) = bool(false) bool(false)
bool(false) = bool(false) bool(false)
NULL = bool(false) bool(false)
string(20) "10000000000000000000" = bool(false) bool(true)
float(1.0E+19) = bool(false) bool(false)
(var-list的来源(几乎与原样)和正则表达式的想法:http://wisercoder.com/check-for-integer-in-php/)
[编辑]
基于preg_match
的函数不起作用,因为它允许溢出整数(当前)或者必须禁止可能的整数。