I seem to get it to work with the following regexp by preg_match():
@^(?:[1-9][0-9]*)|0$@
Yet it's weird that it matches -0, considering there are no - allowed at all in the regexp. Why?
What's more weird is that if you switch the parts divided by |:
@^0|(?:[1-9][0-9]*)$@
It matches all negative integers such as -2 and -10, etc.
What am I missing here? Any better regexp for non-negative integer?
Your regex: @^(?:[1-9][0-9]*)|0$@
1-9 followed by any digit 0 or
more times OR
0.Clearly -0 satisfies condition 2 so you get the match.
The regex you need is: @^(?:[1-9][0-9]*|0)$@
which matches 0 or any other +ve number without leading 0. If leading 0's are allowed then all you need to check is if the input contains digits for which you can use: ^\d+$ as Mark mentions.
Also why not just do a simple check like:
if($input >= 0)
// $input is non -ve.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With