FILTER_SANITIZE 与 FILTER VALIDATE,有何区别 - 以及使用哪个?

FILTER_SANITIZE vs FILTER VALIDATE, whats the difference - and which to use?

目前,我正在 PHP 中制作类似计算器的应用程序,并将表单作为输入方法。为了保护输入,我正在使用 filter_input() 函数。作为过滤器,此函数采用两组元素之一:FILTER_SANITIZEFILTER_VALIDATE,我应该使用哪一个来过滤来自表单的输入?

$number1 = trim(filter_input(INPUT_GET, 'number1', FILTER_VALIDATE_FLOAT));

$number1 = trim(filter_input(INPUT_GET, 'number1', FILTER_SANITIZE_FLOAT));

这取决于您的需要或适合您的应用程序,真的。一个会验证它,然后说 "Yes, this is (or isn't) a valid float",而另一个会清除任何不可接受的值和 return,并且如果原始输入有效或无效则什么都不说。

这同样适用于其他 FILTER_SANITIZE_*FILTER_VALIDATE_* 常量,但在此示例中,我们将按照原始问题中的要求查看浮点验证和卫生。

一起来看看吧!

$float = 0.032;
$not_float = "0.03b2";

var_dump(filter_var($float, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
var_dump(filter_var($not_float, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));

var_dump(filter_var($float, FILTER_VALIDATE_FLOAT));
var_dump(filter_var($not_float, FILTER_VALIDATE_FLOAT));

上述转储中的 return 将是

string(5) "0.032"  // $float          FILTER_SANITIZE_NUMBER_FLOAT
string(5) "0.032"  // $not_float      FILTER_SANITIZE_NUMBER_FLOAT
float(0.032)       // $float          FILTER_VALIDATE_FLOAT
bool(false)        // $not_float      FILTER_VALIDATE_FLOAT

FILTER_SANITIZE_NUMBER_FLOAT 会 return 净化值的 字符串 (PHP 不是强类型语言,所以 "0.032" == 0.032).
您还应该注意 FILTER_FLAG_ALLOW_FRACTION 标志,它保留小数点(如果没有该标志,它将 return 0032)。

如您所见,任何 FILTER_VALIDATE_FLOAT 如果不是有效的浮点数,则 return 将是布尔值 false,如果有效,则为实际的浮点值(即"truthy" 值)。请记住 0.00 将是一个 "falsy" 值,因此如果您希望检查验证是否 失败 ,您应该使用严格比较,以防输入为零,但仍然有效。

if (filter_var($input, FILTER_VALIDATE_FLOAT) === false) {
    // Oh noes! $input wasn't a valid float!
}

你可以在这个live demo.

中自己看看

总结
如果你想在计算中使用它,你可能想要验证它,让用户知道它的格式无效,但你可以清理并使用它。

其他过滤器
这里的示例显示了 FILTER_SANITIZE_FLOAT 的用法,但还有其他验证和注释过滤器。有关完整说明,请参阅以下链接。