我似乎通过preg_match()使用以下正则表达式来实现它:
@^(?:[1-9][0-9]*)|0$@
然而,考虑到正则表达式中根本没有“ - ”,它与'-0'匹配是很奇怪的。为什么呢?
更奇怪的是,如果你将部分切换为|:
@^0|(?:[1-9][0-9]*)$@
它匹配所有负整数,例如'-2'和'-10'等。
我在这里缺少什么?非负整数的任何更好的正则表达式?
答案 0 :(得分:5)
你的正则表达式:@^(?:[1-9][0-9]*)|0$@
1-9
后跟任意数字0
或
更多次 OR 0
结尾的数字。显然-0
满足条件2,所以你得到了匹配。
您需要的正则表达式是:@^(?:[1-9][0-9]*|0)$@
匹配0
或任何其他+ve
号码而不带前导0
。如果允许前导0,那么您需要检查的是输入是否包含您可以使用的数字:^\d+$
作为Mark提及。
另外,为什么不做一个简单的检查,如:
if($input >= 0)
// $input is non -ve.