PHP - filter_var REGEXP 找不到零

PHP - filter_var REGEXP won't find Zero

我想知道为什么我无法将数字零 => 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!");
}

结果:匹配!

PHP函数filter_var() returns the filtered result. From the PHP manual:

Return Values

Returns the filtered data, or FALSE if the filter fails.

您实际上犯了与用户在 filter_var using FILTER_VALIDATE_REGEXP 中询问的错误相同的错误:该函数不验证输入,而是对其进行过滤。如果不匹配,它将 return FALSE 否则它将 return 过滤数据。如果将字符串 "0" 转换为布尔值,则它在 PHP 中的计算结果为 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!