Регулярное выражение на php: только натуральное число

R
На сайте с 29.08.2005
Offline
139
3131

Доброго дня всем и удачного года.

Нарисовалась простая задачка - имеем произвольную переменную $var, нужно определить является ли она натуральным числом или нет. Натуральные числа это: 0,1,2,3,4,5, и так далее до бесконечности. Все, что не входит в этот ряд, должно браковаться.

Погуглил на этот счет, есть несколько вариантов:

preg_match("|^[\d]*$|", $var)

preg_match("/^[0-9]+$/", $var)
preg_match('/^(?!-)[0-9]+$/', $var)

Но на практике они не совсем подходят, так как пропускают такие случаи: 0123, или 0007777, т.е. с нулем (нулями) впереди, а ноль не должен пропускаться.

Примеры, как должно отрабатывать выражение ("ok" или "брак"):

$var=123 ok

$var=12340 ok

$var=0 ok

$var=-0 брак

$var=00 брак

$var=00123 брак

$var=123z брак

$var=123бла-бла-бла-№;%+#@*456789 брак

$var=-123 брак

$var=abc брак

$var=абв брак

Кто-нибудь может подсобить, чем дополнить те примеры, моих знаний регулярных выражений, увы, не хватает.

siv1987
На сайте с 02.04.2009
Offline
427
#1

/^[1-9][0-9]*$/

или

is_numeric($var) AND strcmp($var, intval($var)) === 0

Z1
На сайте с 09.12.2005
Offline
164
#2

siv1987, вашу проверку нолик не пройдёт, а все остальные числа - пройдут.

Вообще, для этих целей есть родная функция is_int (только отрицательные числа надо отсекать).

И $var=00123 - с точки зрения php это 83, что вам покажет echo 00123;

siv1987
На сайте с 02.04.2009
Offline
427
#3
zweroboy1:
siv1987, вашу проверку нолик не пройдёт, а все остальные числа - пройдут.

/^0|[1-9][0-9]*$/

zweroboy1:
Вообще, для этих целей есть родная функция is_int

var_dump( is_int((string) '123') ); //false

Z1
На сайте с 09.12.2005
Offline
164
#4
siv1987:
/^0|[1-9][0-9]*$/
var_dump( is_int((string) '123') ); //false

Логично, строка же. Хотя у ТСа наверное тоже все переменные по сути строки, берущиеся из каких-то инпутов.

R
На сайте с 29.08.2005
Offline
139
#5
siv1987:

/^[1-9][0-9]*$/

бракует 0.

siv1987:

is_numeric($var) AND strcmp($var, intval($var)) === 0

пропускает отрицательные числа, типа $var="-123";

siv1987:

/^0|[1-9][0-9]*$/

пропускает 0123, пропускает -123

siv1987
На сайте с 02.04.2009
Offline
427
#6
Ruslay:
пропускает 0123, пропускает -123

/^(0|[1-9][0-9]*)$/

---------- Добавлено 01.01.2015 в 22:21 ----------

Ruslay:
пропускает отрицательные числа, типа $var="-123";

AND отрицательное_число > 0 ?

Mik Foxi
На сайте с 02.03.2011
Offline
1166
#7

if (ctype_digit($var)) {

echo 'норм число';

}

Антибот, антиспам, веб файрвол, защита от накрутки поведенческих: https://antibot.cloud/ Форум на замену серчу: https://foxi.biz/
O
На сайте с 29.05.2008
Offline
195
#8

if ((string) (int) $var === $var) ...

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий