检查变量值是否为base10整数的最简单和/或最有效的方法是什么?

时间:2014-08-04 17:55:13

标签: php function validation variables integer

我一直试图想一个可以用来检查变量值的函数,如果它是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的函数不起作用,因为它允许溢出整数(当前)或者必须禁止可能的整数。

0 个答案:

没有答案