PHP:检查输入是否为有效数字的最佳方法是什么?

81

如何最好地检查输入是否为数字?

  • 1-
  • +111+
  • 5xf
  • 0xf

这些类型的数字不应该是有效的,只有像123、012(12)、正数这样的数字应该是有效的。 这是我的当前代码:

$num = (int) $val;
if (
    preg_match('/^\d+$/', $num)
    &&
    strval(intval($num)) == strval($num)
    )
{
    return true;
}
else
{
    return false;
}

不要在你的代码的第一行使用(int)! 将其转换为(string),然后使用ctype_digit($num)处理字符串会比int更好(参见手册http://php.net/ctype_digit)!!! - Vladimir Ch
6个回答

81

ctype_digit 函数正是为了这个目的而设计的。


1
在编程中,如果第一行代码是 **$num = (int) $val;**,那么如果要将其转换为字符串,使用 $num = (string) $val; 就可以了,因为这样在手册中有说明! - Vladimir Ch
1
兄弟,你的用户被禁用了,能告诉我们你做了什么吗? - Jose Manuel Abarca Rodríguez

46

我使用

if(is_numeric($value) && $value > 0 && $value == round($value, 0)){

验证一个值是否为数字、正数和整数

http://php.net/is_numeric

我不太喜欢ctype_digit,因为它没有"is_numeric"可读性高,并且在你确实希望验证一个值是否为数字时,它实际上有更少的缺陷。


6
除了 OP 只寻找正整数而不是数字之外,其他都一样。 - user895378

20

filter_var()

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

if (filter_var($int, FILTER_VALIDATE_INT, $options) !== FALSE) {
 // you're good
}

5
+1 这个解决方案更加语义化(尽管更冗长)比 ctype_digit 更好。 - user895378

11
return ctype_digit($num) && (int) $num > 0

11

对于 PHP 4 版本或更高版本:

<?PHP
$input = 4;
if(is_numeric($input)){  // return **TRUE** if it is numeric
    echo "The input is numeric";
}else{
    echo "The input is not numeric";
}
?>

1
最安全的方式。
if(preg_replace('/^(\-){0,1}[0-9]+(\.[0-9]+){0,1}/', '', $value) == ""){
  //if all made of numbers "-" or ".", then yes is number;
}

这个不起作用,例如 OP 的例子中的 "1-" 不应该被视为有效数字,但是根据这个正则表达式它是有效的。 - rowatt
@rowatt - 代表负数。我将它修改为仅考虑以“-”开头的情况。 - Kareem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接