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