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!");
    }

结果:不匹配!

代码片段:

if(preg_match('/^[0-9]+$/i', "0") == 0) {
    print_r("NO MATCH!");
} else {
    print_r("MATCH!");
}

结果:匹配!

4

1 回答 1

1

PHP 函数filter_var()返回过滤后的结果。从 PHP 手册

返回值

返回过滤后的数据,如果过滤器失败,则返回 FALSE。

您实际上犯了与使用 FILTER_VALIDATE_REGEXP在 filter_var 中询问的用户相同的错误:该函数不验证输入,而是对其进行过滤。如果不匹配,则返回,FALSE否则返回过滤后的数据。如果您将其转换为布尔值,那么这就是在 PHP"0"中计算结果的字符串,这通过使用否定运算符 ( ) 发生。false!

因此,您检查了:

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!
于 2015-01-01T20:06:44.880 回答