PHP is_numeric或preg_match 0-9验证

no.*_*no. 36 php validation isnumeric preg-match

这对我来说不是一个大问题(据我所知),这更像是我感兴趣的东西.但是什么的主要区别,如果有的话,使用的is_numeric超过preg_match(或反之亦然),以验证用户输入的值.

示例一:

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

示例二:

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

我假设两者都完全一样,但是有什么具体的差异可能会在某种程度上引起问题吗?有没有"最好的方式"或者我没有看到的东西使它们与众不同.

Spu*_*ley 62

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

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

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

[编辑]

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

/^[1-9][0-9]*$/
Run Code Online (Sandbox Code Playgroud)

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

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

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

/^[1-9][0-9]{0,15}$/
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助.


rap*_*2-h 12

根据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';
  }
?>
Run Code Online (Sandbox Code Playgroud)


Mar*_*c B 7

is_numeric()允许任何形式的数字.所以1,3.14159265,2.71828e10都是"数字",而你的正则表达式归结为相当于is_int()


use*_*291 5

is_numeric将接受"-0.5e + 12"作为有效ID.


Pee*_*Haa 5

不完全一样.

来自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
Run Code Online (Sandbox Code Playgroud)

使用正则表达式,您只需检查"基本"数值.

is_numeric()应该更快.


Jac*_*Lee 5

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

/^[1-9][0-9]*$/
Run Code Online (Sandbox Code Playgroud)

但是,正如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}$/ 
Run Code Online (Sandbox Code Playgroud)

要么

/^[1-9][0-9]{0-17}$/
Run Code Online (Sandbox Code Playgroud)

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

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