PHP is_numeric或preg_match 0-9 验证

2022-08-30 11:38:26

这对我来说不是一个大问题(据我所知),它更像是我感兴趣的东西。但是,使用 over(反之亦然)来验证用户输入值的主要区别(如果有)是什么。is_numericpreg_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
    }
?>

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


答案 1

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

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

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

[编辑]

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

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

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

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

您可能希望限制位数,因为就目前情况而言,它将允许太大而无法存储为整数的字符串。要对此进行限制,您可以将星形更改为长度限制,如下所示:

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

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

希望有所帮助。


答案 2

根据 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';
  }
?>

推荐