正则表达式只验证自然数?

sor*_*ist 6 php regex preg-match

我最近发现我用来验证用户输入的方法接受了一些我不是特别满意的值.我需要它来只接受自然数(1,2,3等),而不非数字字符.

我的方法看起来像这样:

function is_natural($str)
{
   return preg_match('/[^0-9]+$/', $str) ? false : $str;
}
Run Code Online (Sandbox Code Playgroud)

所以如果它找到除了一个完整的自然数之外的其他东西,它应该返回false.问题是,它接受类似"2.3"甚至是字符串"2.3,2.2"

Cra*_*ent 17

也许你可以澄清"数字"和"数字"之间的区别?

无论如何,你可以使用

if (preg_match('/^[0-9]+$/', $str)) {
  // contains only 0-9
} else {
  // contains other stuff
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用

$str = (string) $str;
ctype_digit($str);
Run Code Online (Sandbox Code Playgroud)

  • **仔细阅读**:`/^[0-9]+$/` 接受 `0`。我建议您应该使用 `/^[1-9][0-9]*$/` 代替。 (2认同)

Kor*_*tor 16

问题/^[0-9]+$/是它也接受像这样的值0123.正确的正则表达式是/^[1-9][0-9]*$/.

ctype_digit() 遇到同样的问题.

如果你还需要包括零使用这个正则表达式: /^(?:0|[1-9][0-9]*)$/

  • "自然数"是从1开始的每个普通数(ℕ).这就是我认为"0123"无效的原因. (7认同)