繁体   English   中英

PHP is_numeric 或 preg_match 0-9 验证

[英]PHP is_numeric or preg_match 0-9 validation

这对我来说不是什么大问题(据我所知),它更多是我感兴趣的事情。 但是,使用is_numeric不是preg_match (反之亦然)来验证用户输入值的主要区别是什么(如果有的话)。

示例一:

<?php
    $id = $_GET['id'];
    if (!preg_match('/^[0-9]*$/', $id)) {
        // Error
    } else {
        // Continue
    }
?>

示例二:

<?php
    $id = $_GET['id'];
    if (!is_numeric($id)) {
        // Error
    } else {
        // Continue
    }
?>

我认为两者完全相同,但是否有任何特定差异可能会在以后以某种方式导致问题? 是否有“最佳方式”或我没有看到的使它们不同的东西。

is_numeric()测试值是否为数字。 它不一定必须是整数 - 它可以是十进制数字或科学记数法中的数字。

您给出的preg_match()示例仅检查值是否包含0到9的数字; 任何数量的,以任何顺序。

请注意,您提供的正则表达式也不是一个完美的整数检查器,就​​像您编写它一样。 它不允许否定; 它确实允许一个零长度的字符串(即根本没有数字,这可能不应该是有效的?),并且它允许该数字具有任意数量的前导零,这也可能不是预期的。

[编辑]

根据您的评论,更好的正则表达式可能如下所示:

/^[1-9][0-9]*$/

这会强制第一个数字仅在1到9之间,因此您不能有前导零。 它还强制它至少长一个数字,因此解决了零长度字符串问题。

你并不担心负面因素,所以这不是问题。

您可能希望限制位数,因为事实上,它将允许太大的字符串不能存储为整数。 要限制此值,您可以将星形更改为长度限制,如下所示:

/^[1-9][0-9]{0,15}$/

这将允许字符串长度在1到16位之间(即第一个数字再加上0-15个数字)。 您可以根据自己的需要随意调整花括号中的数字。 如果需要固定长度的字符串,则只需在大括号中指定一个数字。

希望有所帮助。

根据http://www.php.net/manual/en/function.is-numeric.php,is_numeric类似于“+ 0123.45e6”或“0xFF”。 我认为这不是你所期望的。

preg_match可能很慢,你可以有类似0000或0051的东西。

我更喜欢使用ctype_digit(仅适用于字符串,可以使用$ _GET)。

<?php
  $id = $_GET['id'];
  if (ctype_digit($id)) {
      echo 'ok';
  } else {
      echo 'nok';
  }
?>

is_numeric()允许任何形式的数字。 所以13.141592652.71828e10都是“数字”,而你的正则表达式归结为相当于is_int()

is_numeric检查它是否是任何类型的数字,而你的正则表达式检查它是否是一个整数,可能是前导0。 对于存储为整数的id,很可能我们不希望前导0。 按照Spudley的回答,我们可以做到:

/^[1-9][0-9]*$/

但是,正如Spudley所说,结果字符串可能太大而无法存储为32位或64位整数值。 带符号的32位整数的最大值为2,147,483,647(10位),带符号的64位整数的最大值为9,223,372,036,854,775,807(19位)。 但是,许多10和19位整数分别大于最大32位和64位整数。 一个简单的正则表达式解决方案是:

/^[1-9][0-9]{0-8}$/ 

要么

/^[1-9][0-9]{0-17}$/

但这些“解决方案”不幸地将每个解决方案限制为9位和19位整数; 几乎没有令人满意的结果。 更好的解决方案可能是:

$expr = '/^[1-9][0-9]*$/';
if (preg_match($expr, $id) && filter_var($id, FILTER_VALIDATE_INT)) {
    echo 'ok';
} else {
    echo 'nok';
}

is_numeric将接受“-0.5e + 12”作为有效ID。

不完全一样。

来自is_numeric的PHP文档:

'42' is numeric
'1337' is numeric
'1e4' is numeric
'not numeric' is NOT numeric
'Array' is NOT numeric
'9.1' is numeric

使用正则表达式,您只需检查“基本”数值。

is_numeric()应该更快。

is_numeric检查更多:

查找给定变量是否为数字。 数字字符串由可选符号,任意数量的数字,可选的小数部分和可选的指数部分组成。 因此+ 0123.45e6是有效的数值。 也允许使用十六进制表示法(0xFF),但只能使用符号,十进制和指数部分。

PHP的is_numeric函数允许浮点数和整数。 同时,如果要验证表单数据(仅限字符串),则is_int函数太严格。 因此,您通常最好使用正则表达式。

严格来说,整数是正数和负数,也包括零。 这是一个正则表达式:

/ ^ 0 $ |?^ [ - ] [1-9] [0-9] * $ /

或者,如果要允许前导零:

/ ^ [ - ]?[0] | [1-9] [0-9] $ /

请注意,这将允许使用-0000这样的值,但不会导致PHP出现问题。 (MySQL也会将这些值转换为0.)

您可能还需要限制整数的长度,以考虑32/64位PHP平台功能和/或数据库兼容性。 例如,要将整数的长度限制为9位(不包括可选的 - 符号),您可以使用:

/ ^ 0 $ |?^ [ - ] [1-9] [0-9] {0,8} $ /

您可以使用此代码进行数字验证:

if (!preg_match("/^[0-9]+$/i", $phone)) {
        $errorMSG = 'Invalid Number!';
        $error    = 1;
    }

如果你只是检查它是否是一个数字, is_numeric()在这里好得多。 它比正则表达式更具可读性和快速性。

这里你的正则表达式的问题是它不允许十进制值,所以基本上你只是在正则表达式中编写了is_int() 只有在输入中存在非标准数据格式时才应使用正则表达式; PHP有很多内置的验证功能,甚至是没有正则表达式电子邮件验证器

同时,上面的所有值只会将值限制为整数,所以我使用

/^[1-9][0-9\.]{0,15}$/

允许浮动值。

您可以使用 filter_var() 检查字符串中的整数

<?php
$intnum = "1000022";
if (filter_var($intnum, FILTER_VALIDATE_INT) !== false){
    echo $intnum.' is an int now';
}else{
    echo "$intnum is not an int.";
}
// will output 1000022 is an int now

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM