Регулярное выражение для сопоставления неотрицательных целых чисел в PHP? - PullRequest
6 голосов
/ 19 апреля 2010

Мне кажется, что он работает со следующим регулярным выражением с помощью preg_match ():

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

Тем не менее, странно, что он соответствует '-0', учитывая, что в регулярном выражении вообще нет '-'. Почему?

Что еще страннее, если вы поменяете части на |:

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

Соответствует всем отрицательным целым числам, таким как '-2' и '-10' и т. Д.

Что мне здесь не хватает? Есть ли лучшее регулярное выражение для неотрицательного целого числа?

1 Ответ

5 голосов
/ 19 апреля 2010

Ваше регулярное выражение: @^(?:[1-9][0-9]*)|0$@

  1. говорит, совпадают те числа, которые начинаются с 1-9, за которым следует любая цифра 0 или больше раз ИЛИ
  2. соответствует тем числам, которые заканчиваются на 0.

Очевидно, -0 удовлетворяет условию 2, поэтому вы получите совпадение.

Необходимое регулярное выражение: @^(?:[1-9][0-9]*|0)$@

, который соответствует 0 или любому другому +ve номеру без начального 0. Если разрешены начальные 0, то все, что вам нужно проверить, это то, содержит ли ввод цифры, для которых вы можете использовать: ^\d+$, как отмечает Марк.

Кроме того, почему бы просто не сделать простую проверку, такую ​​как:

if($input >= 0)
 // $input is non -ve.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...