Мне интересно, почему я не могу сопоставить число ноль => 0 с функцией PHPs 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!");
}
Результат: НЕ СОВПАДАЕТ!
Фрагмент кода:
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, если вы приведете его к логическому, что происходит с помощью оператора отрицания (!
).
Поэтому вы проверили:
if (!"0") {
print_r("NO MATCH!");
} else {
print_r("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!
Других решений пока нет …