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()返回过滤结果。从 PHP 手册:

返回值

返回

筛选的数据,如果筛选器失败,则返回 FALSE。

您实际上犯了与用户使用 FILTER_VALIDATE_REGEXP filter_var询问相同的错误:该函数不验证输入,而是对其进行过滤。如果不匹配,它将返回FALSE否则将返回过滤后的数据。这就是字符串"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!