kiowas

kiowas
Рейтинг
61
Регистрация
06.02.2010
ortegas:
siv1987, нет. Смешно ведь для проверки чисел использовать регулярные выражения.

Да, ваш вариант как бы правильней будет.

---------- Добавлено 07.06.2013 в 20:29 ----------

turen:

$y = filter_var($x, FILTER_VALIDATE_INT, array('options'=>array('min_range'=>1)));
if($y === false)
{
echo "FAIL";
}

или

$y = test_nat($x);
if($y === false)
{
echo "FAIL";
}

function test_nat($x)
{
return filter_var($x, FILTER_VALIDATE_INT, array('options'=>array('min_range'=>1)));
}

Разницы между двумя способами не вижу, но все равно, будет проходить проверку, если:

$var = true;

Нужно еще лепить конструкцию.

siv1987:
if(is_numeric($num) AND $num > 0 AND ! preg_match('/^0|\./', $num)) return true;
return false;

Вы тоже гений!!! Хорошо!

А теперь вопрос: почему не сделаю такой тип или проверку. Положа руку на сердце, каждый скажет, что в веб программировании, переменных, которые по идее должны содержать именно такой тип данных подавляющее большинство!!! Согласитесь!

ortegas:
kiowas, не правда. Перепроверьте с ===.

Вы гений, просто божественный программист!!! 🤪 🍻

Красиво, просто. Браво, я аплодирую вам стоя! Сейчас пойду покурю в неположенное место и буду там аплодировать!!!!

SVatlin:
Правильнее будет так:
if( ! preg_match('/[^0-9]/', $num) OR $num < 1 ) return false;

Нет, тот вариант был правильней, этот вообще далеко. :)

---------- Добавлено 07.06.2013 в 20:19 ----------

ortegas:

function is_positive($num) {
if (isset($num) && (is_int($num) or ((string)(int)$num == $num)) && $num > 0)
return true;
else
return false;
}

Тоже самое :(

Не проходит:

1. $var = '054';

2. $var = 'true';

И еще пару вариантов. Нужно лепить дальше....

dkameleon:
preg_match('#^\d+$#', $num) && $num > 0

Спасибо за интерес 😂

Проходит проверку если:

1. $var = '054';

2. $var = true;

А так же если переменная является объектом или массивом. Нужно еще лепить... :)

---------- Добавлено 07.06.2013 в 20:12 ----------

ortegas:
function is_positive($num) {

if (isset($num) && (is_int($num) or (is_numeric($num) and floor($num) == $num)) && $num > 0)
return true;
else
return false;
}

Срабатывает если:

1. $var = '054';

2. $var = '25.0'

Нужно еще лепить.

siv1987:
kiowas, вы уж извините, вы изначально не правильно поставили задачу. Валидация данных по своему критерию и проверка типа данных - это разные вещи.

Согласен, вы разбили задачу на две составляющих, пускай будет так. Может кто-то еще прилепит к этому конъюнкцию, т.е. соединит две проверки. Эт все не так важно.

Важно решить задачу красиво. Есть переменная. Нужно понять, является ли она целым положительным числом или строкой содержащей это число, например '15' или '15486'. Лишних знаков не должно быть.

siv1987:
да боже ж ты мой
if( preg_match('/[^0-9]/', $num) OR $num < 1 ) return false;
return true;

😂

Проходит, если:

1. $var = '054';

2. $var = true;

А так же если переменная является массивом или объектом. Нужно еще лепить....

dkameleon:
или же я задачу понял не полностью...

Проходит проверку, если:

1. $var = 'asdfa';

2. $var = '25.0'

И много где еще.... :(

ortegas:
(string)(int)$var === $var. Красиво - но плохо.

Зачем эта универсальность? В $_POST, $_GET приходят переменные уже с определенным типом. То-есть, если нужен Ineteger (не Float) с значением больше 0, достаточно проверить на is_int и > 0.

Проверка не только переменных из $_POST и $_GET. Вот в чем соль :(

---------- Добавлено 07.06.2013 в 20:00 ----------

Оптимизайка:
Не, ну если переменная может содержать любой тип данных, то:

(is_string($var) || is_numeric($var)) && ctype_digit((string)$var)

Очень близко, но нужно лепить дополнительные проверки, так как проверку проходят занчения:

1. $var = '054';

2. $var = '0';

3. $var = 0;

siv1987:
kiowas, либо вы не то пишите, либо вы не то проверяете... и 0 и '0' результат bool(true). Может у нас разные версии php?..

В preg_match стоит маска /[^0-9]+/

Она срабатывает, если найдено что-то не похожее на цифру и тогда возвращается false.

Если я передам в нее '0', он подумает, что это цифра и вернет true, но это не положительное целое число.

Всего: 300