PHP - filter_var REGEXP не найдет ноль

0

Мне интересно, почему я не могу сопоставить число с нулем => 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!");
}

Результат: МАТЧА!

  • 0
    filter_var и preg_match - две разные функции, которые не являются взаимозаменяемыми. И то, что вы пишете в своем названии вопроса, неверно. filter_var находит ноль с кодом, который у вас есть.
Теги:
preg-match
zero
filter-var

1 ответ

1
Лучший ответ

Функция 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!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню