Regex для проверки только натуральных чисел? - PullRequest
6 голосов
/ 02 февраля 2011

Я недавно обнаружил, что метод, который я использовал для проверки пользовательского ввода, принимает некоторые значения, которыми я не особенно доволен.Мне нужно, чтобы он принимал только натуральные числа (1, 2, 3 и т. Д.) Без цифр.

Мой метод выглядит следующим образом:

function is_natural($str)
{
   return preg_match('/[^0-9]+$/', $str) ? false : $str;
}

Таким образом, он должен возвращать false, если он находит что-то еще, кроме целого натурального числа.Проблема в том, что он принимает строки типа "2.3" и даже "2.3,2.2"

Ответы [ 4 ]

16 голосов
/ 02 февраля 2011

возможно, вы можете уточнить разницу между «числом» и «цифрой» ??

В любом случае, вы можете использовать

if (preg_match('/^[0-9]+$/', $str)) {
  // contains only 0-9
} else {
  // contains other stuff
}

или вы можете использовать

$str = (string) $str;
ctype_digit($str);
16 голосов
/ 02 февраля 2011

Проблема с /^[0-9]+$/ заключается в том, что он также принимает значения типа 0123.Правильное регулярное выражение /^[1-9][0-9]*$/.

ctype_digit() страдает той же проблемой.

Если вам также необходимо включить ноль, используйте вместо этого регулярное выражение: /^(?:0|[1-9][0-9]*)$/

2 голосов
/ 02 февраля 2011

Используйте ctype_digit () вместо

0 голосов
/ 30 марта 2018

У меня возникла проблема с ctype_digit, когда номера счетов, такие как "000000196", должны были пройти через ctype_digit.

Поэтому я использовал:

if (preg_match('/^[1-9][0-9]?$/', $str)) {
  // only integers
} else {
  // string
}
...