我最近发现我一直在使用的验证用户输入的方法接受了一些我不太满意的值。我需要它只接受自然数(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);
/^[0-9]+$/
接受 0
。我建议您使用 /^[1-9][0-9]*$/
。 - Константин Ван0
不是一个数字吗? - CrayonViolent/^[0-9]+$/
的问题在于它还接受类似0123
的值。
正确的正则表达式是/^[1-9][0-9]*$/
。
ctype_digit()
也有相同的问题。
如果您还需要包括零,请改用此正则表达式:/^(?:0|[1-9][0-9]*)$/
03
= 3,11
= 11,但是 011
= 9。 - Damian Yerrick我在使用ctype_digit时遇到了问题,当发票号码像“000000196”这样时,必须通过ctype_digit。
所以我使用了:
if (preg_match('/^[1-9][0-9]?$/', $str)) {
// only integers
} else {
// string
}
filter_var
:https://dev59.com/f1jUa4cB1Zd3GeqPVN3z#6563394请查看该帖子 - T.Todua