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

Php 正则表达式只验证自然数?,php,regex,preg-match,Php,Regex,Preg Match,我最近发现,我用来验证用户输入的方法接受了一些我不太满意的值。我需要它只接受没有非数字字符的自然数(1、2、3,等等) 我的方法如下所示: function is_natural($str) { return preg_match('/[^0-9]+$/', $str) ? false : $str; } 因此,如果它发现除了一个完整的自然数之外的任何东西,它应该返回false。问题是,它接受像“2.3”这样的字符串,甚至“2.3,2.2”使用它来代替也许您可以澄清“数字”和“数字”之间

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

我的方法如下所示:

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

因此,如果它发现除了一个完整的自然数之外的任何东西,它应该返回false。问题是,它接受像
“2.3”
这样的字符串,甚至
“2.3,2.2”
使用它来代替也许您可以澄清“数字”和“数字”之间的区别

无论如何,你可以使用

if (preg_match('/^[0-9]+$/', $str)) {
  // contains only 0-9
} else {
  // contains other stuff
}
$str = (string) $str;
ctype_digit($str);
或者你可以使用

if (preg_match('/^[0-9]+$/', $str)) {
  // contains only 0-9
} else {
  // contains other stuff
}
$str = (string) $str;
ctype_digit($str);

/^[0-9]+$/
的问题在于它也接受类似于
0123
的值。 正确的正则表达式是
/^[1-9][0-9]*$/

ctype\u digit()
也有同样的问题


如果您还需要包含零,请使用此正则表达式:
/^(?:0 |[1-9][0-9]*)$/

当发票号(如“000000 196”)必须通过ctype_数字时,我遇到了ctype_数字的问题

因此,我使用了:

if (preg_match('/^[1-9][0-9]?$/', $str)) {
  // only integers
} else {
  // string
}

“自然数但没有数字”是什么意思?你想要没有的数字是什么?这个正则表达式不能匹配一个点或逗号。我使用
filter\u var
:请参阅文章,我想我误解了数字的可能重复。它只需要接受数字。看起来ctype\u digit只接受字符串形式的数字,我需要它来接受整数。是的,ctype\u digit()可以工作,但是请注意我是如何首先将$str转换为字符串的,因为如果将整数传递给它,ctype\u digit()将始终返回false。如果ctype\u digit()对字符串(如“2.2,2.3”)仍然返回TRUE对于'2.2,2.3'返回true,那么它是一个应该在bugs.PHP.net上引发的PHP错误,但我无法复制它fault@CrayonViolent这篇文章有多老并不重要,因为谷歌可以引导像我这样的人去读这篇文章。嗯,无论如何。我想说的是,提问者正在寻找一个自然数的正则表达式(ℕ). 请阅读这篇文章:接受0123并没有什么特别有害的。这取决于他总体上的预期,他打算用它做什么……但例如,0123在计算中会被评估为123……一个“自然数”是从1开始的每一个普通数(ℕ). 这就是为什么我认为“0123”是无效的。是的,但正如OP指出的,他对定义感到困惑。因此,这再次归结为他想要实际使用它的目的。小数点左侧的前导零并不比小数点右侧的尾随零更重要。@tchrist在数字分析器试图自动检测octal.T的情况下,它们是重要的他的意思是
03
=3,
11
=11,但
011
=9。这个问题已经有七年历史了,已经有了一个公认的七年历史的答案。而且,你使用的模式已经被其他用户建议过了。