Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regular expression to match non-negative integers in PHP?

Tags:

regex

php

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?

like image 351
datasn.io Avatar asked Apr 19 '10 03:04

datasn.io


1 Answers

Your regex: @^(?:[1-9][0-9]*)|0$@

  1. says match those number that start with 1-9 followed by any digit 0 or more times OR
  2. match those numbers that end with 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.
like image 50
codaddict Avatar answered Nov 07 '22 03:11

codaddict