我最近发现我用来验证用户输入的方法接受了一些我并不特别满意的值。我需要它只接受自然数字(1
,2
,3
等)而没有非数字字符。
我的方法如下:
function is_natural($str)
{
return preg_match('/[^0-9]+$/', $str) ? false : $str;
}
所以如果它找到除了一个完整的自然数之外的任何东西,它应该返回false。问题是,它接受"2.3"
甚至"2.3,2.2"
答案 0 :(得分:16)
/^[0-9]+$/
的问题在于它还接受0123
之类的值。
正确的正则表达式为/^[1-9][0-9]*$/
。
ctype_digit()
遇到同样的问题。
如果您还需要包括零,请使用此正则表达式:/^(?:0|[1-9][0-9]*)$/
答案 1 :(得分:15)
也许你可以澄清“数字”和“数字”之间的区别?
无论如何,你可以使用
if (preg_match('/^[0-9]+$/', $str)) {
// contains only 0-9
} else {
// contains other stuff
}
或者您可以使用
$str = (string) $str;
ctype_digit($str);
答案 2 :(得分:2)
使用ctype_digit()代替
答案 3 :(得分:-1)
当“000000196”等发票号必须通过ctype_digit时,我遇到了ctype_digit的问题。
所以我使用了:
if (preg_match('/^[1-9][0-9]?$/', $str)) {
// only integers
} else {
// string
}