检查正整数(PHP)的最佳方法是什么?

时间:2011-01-30 19:19:25

标签: php validation

我需要检查表单输入值是否为正整数(而不仅仅是整数),我注意到使用下面代码的另一个代码段:

$i = $user_input_value;
if (!is_numeric($i) || $i < 1 || $i != round($i)) {
  return TRUE;
}

我想知道使用上面的三项检查是否有任何好处,而不仅仅是这样做:

$i = $user_input_value;
if (!is_int($i) && $i < 1) {
  return TRUE;
}

20 个答案:

答案 0 :(得分:33)

不确定为什么没有建议在此使用filter_var。我知道这是一个老线程,但也许它会帮助某人(毕竟,我最终来到这里,对吗?)。

$filter_options = array( 
    'options' => array( 'min_range' => 0) 
);


if( filter_var( $i, FILTER_VALIDATE_INT, $filter_options ) !== FALSE) {
   ...
}

您也可以添加最大值。

$filter_options = array(
    'options' => array( 'min_range' => 0,
                        'max_range' => 100 )
);

http://php.net/manual/en/function.filter-var.php

http://www.php.net/manual/en/filter.filters.validate.php

答案 1 :(得分:32)

两个代码段之间的区别在于,如果$ i是数字字符串is_numeric($i)也会返回true,但如果$ i是整数,则is_int($i)仅返回true而不是$ i是整数字符串。这就是为什么你应该使用第一个代码片段,如果你想要返回true,如果$ i是整数字符串(例如,如果$ i ==“19”而不是$ i == 19)。

有关详细信息,请参阅这些参考资料:

php is_numeric function

php is_int function

答案 2 :(得分:15)

当变量可以是INTEGER或STRING表示整数时检查正整数的最佳方法:

 if ((is_int($value) || ctype_digit($value)) && (int)$value > 0 ) { // int }
如果值类型为is_int()

integer将返回true。如果类型为ctype_digit(),则string将返回true,但字符串的值为整数。

此检查与is_numeric()之间的区别在于is_numeric()即使对于表示非整数数字的值(例如“+0.123”),也会返回true。

答案 3 :(得分:12)

它肯定会走向微优化的领域,但是嘿:我正在研究的代码每天都在咀嚼数百万件物品,而且是周五。所以我做了一些实验...

for ($i = 0; $i < 1000000; $i++) {
    // Option 1: simple casting/equivalence testing
    if ((int) $value == $value && $value > 0) { ... }

    // Option 2: using is_int() and ctype_digit().  Note that ctype_digit implicitly rejects negative values!
    if ((is_int($value) && $value > 0) || ctype_digit($value)) { ... }

    // Option 3: regular expressions
    if (preg_match('/^\d+$/', $value)) { ... }
}

然后我为整数和字符串值运行了上述测试

选项1:简单的投射/等效性测试

  • 整数:0.3s
  • 字符串:0.4s

选项2:使用is_int()和ctype_digit()

  • 整数:0.9s
  • 字符串:1.45s

选项3:正则表达式

  • 整数:1.83s
  • 字符串:1.60s

也许不足为奇的是,选项1是迄今为止最快的,因为没有函数调用,只是强制转换。值得注意的是,与其他方法不同,选项1将string-float-integer值“5.0”视为整数:

$valList = array(5, '5', '5.0', -5, '-5', 'fred');
foreach ($valList as $value) {
    if ((int) $value == $value && $value > 0) {
        print "Yes: " . var_export($value, true) . " is a positive integer\n";
    } else {
        print "No: " . var_export($value, true) . " is not a positive integer\n";
    }
}

Yes: 5 is a positive integer
Yes: '5' is a positive integer
Yes: '5.0' is a positive integer
No: -5 is not a positive integer
No: '-5' is not a positive integer
No: 'fred' is not a positive integer

对于您的特定用例而言,这是否是一件好事,留给读者练习......

答案 4 :(得分:5)

检查整数的另一种最佳方法是使用正则表达式。您可以使用以下代码检查Integer值。浮点值将为false。

if(preg_match('/^\d+$/',$i)) {
  // valid input.
} else {
  // invalid input.
}

最好是否可以检查$ i&gt; 0也是。

答案 5 :(得分:2)

而不是检查具有多个条件的class Test : UIView { var faceCenter : CGPoint = CGPointZero // give a default value, give correct value in the init method var faceCenterAlpha: CGPoint { // getter print("getter") return convertPoint(center, fromView: superview) } lazy var faceCenterBeta: CGPoint = { [unowned self] in // closure print("closure") return self.convertPoint(self.center, fromView: self.superview) }() func faceCenterDelta() -> CGPoint { // good ol' function print("function") return convertPoint(center, fromView: superview) } init() { super.init(frame: CGRectZero) faceCenter = convertPoint(center, fromView: superview) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } let test = Test() // executed every time, just like a function test.faceCenterAlpha test.faceCenterAlpha test.faceCenterAlpha // only executed once test.faceCenterBeta test.faceCenterBeta test.faceCenterBeta OR int,如:

string

您可以通过将输入转换为if ( ctype_digit($i) || ( is_int($i) && $i > 0 ) ) { return TRUE; } 来简化此操作,以便一个(string)来电同时检查ctype_digitstring输入:

int

答案 6 :(得分:2)

Laravel 4.2正数验证规则

只需要正数,包括浮点值。

public static $rules = array(
    'field_name' => 'required|regex:/^\d*\.?\d*$/'
);

e.g:20,2.6,06

答案 7 :(得分:2)

定义:

!A = !is_numeric($i)
B = $i < 1
!C = $i != round($i)

则...

!is_numeric($ i)|| $ i&lt; 1 || $ i!= round($ i)等于 !A || B || !ç

所以:

!A || B || !C = !A || !C || B

现在,使用deMorgan定理,即(!A ||!C)=(A&amp;&amp; C),然后:

!A || !C || B = (A && C) || B

现在,请注意A&amp;&amp; C = is_numeric($ i)&amp;&amp; $ i == round($ i),但如果$ i == round($ i)为TRUE,则is_numeric($ i)也为TRUE,因此我们可以简化A&amp;&amp; C = C so,

(A&amp;&amp; C)|| B = C || B =

$i == round($i) || $i < 1

所以你只需要使用:

$i = $user_input_value;
if ($i == round($i) || $i < 1) {
  return TRUE;
}

答案 8 :(得分:2)

除了所有其他答案:您可能正在寻找ctype_digit。它查找仅包含数字的字符串。

答案 9 :(得分:1)

检查正整数使用:

$i = $user_input_value;
if (is_int($i) && $i > 0) {
  return true; //or any other instructions 
}

OR

$i = $user_input_value;
if (!is_int($i) || $i < 1) {
  return false; //or any other instructions 
}

使用符合您目的的那个,因为它们是相同的。以下示例演示了is_numeric()is_int()

之间的区别
is_numeric(0);     // returns true
is_numeric(7);     // returns true
is_numeric(-7);    // returns true
is_numeric(7.2);   // returns true
is_numeric("7");   // returns true
is_numeric("-7");  // returns true
is_numeric("7.2"); // returns true
is_numeric("abc"); // returns false

is_int(0);     // returns true
is_int(7);     // returns true
is_int(-7);    // returns true
is_int(7.2);   // returns false
is_int("7");   // returns false
is_int("-7");  // returns false
is_int("7.2"); // returns false
is_int("abc"); // returns false

答案 10 :(得分:1)

所有这些答案都忽略了请求者可以检查表单输入的事实 is_int()将失败,因为表单输入是一个字符串 对于浮点数,is_numeric()也是正确的 这就是为什么$ i == round($ i)进来,因为它检查输入是一个整数。

答案 11 :(得分:1)

好的,我知道这个帖子真的很老了,但我同意@Jeffrey Vdovjak的观点:既然我能找到它,它可能仍然可以帮助其他人。

php的gmp_sign()可能是另一种简单的检查方法。它适用于整数和数字字符串,如果a为正则返回1,如果a为负则返回-1,如果a为0则返回0。

所以:

// positive
echo gmp_sign("500") . "\n";

// negative
echo gmp_sign("-500") . "\n";

// zero
echo gmp_sign("0") . "\n";

将输出:

1
-1
0

请参阅http://php.net/manual/en/function.gmp-sign.php

上的功能手册

P.S。您需要在.ini文件中启用php_gmp.dll。

答案 12 :(得分:1)

    preg_match('{^[0-9]*$}',$string))

如果你想限制长度:

    preg_match('{^[0-9]{1,3}$}',$string)) //minimum of 1 max of 3

S positive int,最大长度为6:

    if(preg_match('{^[0-9]{1,6}$}',$string)) && $string >= 0)

答案 13 :(得分:1)

你真的不需要使用所有三个检查,如果你想要一个正整数,你可能想要做与你的代码相反的事情:

if(is_numeric($i) && $i >= 0) { return true; }

查看Sören的答案,了解有关is_int()is_numeric()之间差异的更多信息

答案 14 :(得分:1)

if(preg_match('/^[1-9]\d*$/',$i)) {
   //Positive and > 0
}

答案 15 :(得分:1)

第一个例子是使用round来验证输入是一个整数,而不是一个不同的数值(即:十进制)。

如果传递一个字符串,

is_int将返回false。请参阅PHP manual examples for is_int

答案 16 :(得分:0)

if(isset($i) && is_int($i) && $i >= 0){ //0 is technically a postive integer I suppose
    return TRUE; //or FALSE I think in your case.
}

答案 17 :(得分:0)

如果使用“is_int”,则变量必须为整数,因此它不能是浮点值。 (不需要轮次)。

答案 18 :(得分:0)

我会做这样的事情:

if ((int) $i > 0) {
    // this number is positive
}

根据前面的减号,该数字被转换为正数或负数。然后将类型转换数大于0,以确定该数字是否为正。

答案 19 :(得分:0)

这是我的解决方案,希望对您有所帮助:

if (is_numeric($i) && (intval($i) == floatval($i)) && intval($i) > 0)
   echo "positive integer";

我检查字符串是否为数字,第二次检查确定它是否为整数,第三次检查确定为正数