Мне интересно, почему я не могу сопоставить число с нулем => 0 с функцией php filter_var и с PHP preg_match, он может найти нулевое число.
Может кто-нибудь помочь мне, как я получил это, чтобы работать с filter_var или это ошибка?
Фрагмент кода:
if(!filter_var("0", FILTER_VALIDATE_REGEXP, array("options" => array("regexp" => '/^[0-9]+$/i')))) {
print_r("NO MATCH!");
} else {
print_r("MATCH!");
}
Результат: NO MATCH!
Фрагмент кода:
if(preg_match('/^[0-9]+$/i', "0") == 0) {
print_r("NO MATCH!");
} else {
print_r("MATCH!");
}
Результат: МАТЧА!
Функция PHP filter_var()
возвращает результат фильтрации. Из руководства по PHP:
Возвращаемые значения
Возвращает отфильтрованные данные или FALSE, если фильтр не работает.
Вы практически сделали ту же ошибку, что и пользователь, запрашивающий в filter_var с помощью FILTER_VALIDATE_REGEXP: функция не проверяет ввод, он его фильтрует. Если он не совпадает, он вернет FALSE
иначе он вернет отфильтрованные данные. И это строка "0"
которая оценивает значение false
в PHP, если вы добавите ее в boolean, что происходит с помощью оператора отрицания (!
).
Поэтому вы проверили:
if (!"0") {
print_r("NO MATCH!");
} else {
print_r("MATCH!");
}
Что это такое. Таким образом, вы выводите о "match", но вы "если" о самом значении, а не о матче.
Напишите лучший код, просто используя простое назначение переменной:
$var = "0";
$result = filter_var($var, FILTER_VALIDATE_REGEXP, array("options" => array("regexp" => '/^[0-9]+$/i')));
if (!$result) {
print_r("NO MATCH!");
} else {
print_r("MATCH!");
}
Это позволит вам быстрее и легче справиться:
var_dump($result); // string(1) "0"
И далее:
$var = "0";
$result = filter_var($var, FILTER_VALIDATE_REGEXP, array("options" => array("regexp" => '/^[0-9]+$/i')));
if ($var !== $result) {
print_r("NO MATCH!");
} else {
print_r("MATCH!");
}
Это то, что вы, возможно, хотели написать раньше. Вывод:
MATCH!
filter_var
иpreg_match
- две разные функции, которые не являются взаимозаменяемыми. И то, что вы пишете в своем названии вопроса, неверно.filter_var
находит ноль с кодом, который у вас есть.