PHP 模式仍然是必要的还是 filter_var 可以解决所有问题

PHP are patterns still necessary or does filter_var take care of it all

今天早上我在读一篇文章时偶然发现了这个

Most people tend to think of data validation as an immensely tedious process where one either:

Compares the data they want to validate against every possible combination they can think of. Tries to find a golden Regular Expression that will match every possible combination.
A combination of the two.
There are obvious problems with the above listed:

It's absolutely time consuming. There is a very high chance of error. Fortunately, beginning with version 5.2, PHP has included a great function called filter_var that takes away the pain of data validation.

模式是否仍然是必需的,还是 filter_var 全部完成。

如果您所说的模式是指正则表达式,那么您问题的答案是。为什么?内置过滤器可能无法完全按照您的要求清理或验证您的数据。过滤器可能过于宽泛,或者它们可能过于严格地符合您的特定情况的标准。许多过滤器实际上根本不符合标准。

例如,FILTER_SANITIZE_EMAILFILTER_VALIDATE_EMAIL 可能允许奇怪的电子邮件地址,虽然在 RFC 意义上技术上是合法的,但根据您的需要可能是不受欢迎的。作为开发人员,您的应用程序的创建者,您可以决定您真正想要接受的电子邮件地址。

PHP 过滤器的创建者明白,一刀切是不切实际的主张。因此,您可以使用 FILTER_CALLBACK 提供您自己的 sanitizing/validating 过滤器,并使用 FILTER_VALIDATE_REGEXP 提供您自己的验证过滤器。我们回到第一广场了吗?我们过得更好吗?

真正的问题是您是否愿意购买并接受 PHP 过滤系统建立的"filtering framework/methodology"。我呢?我首先使用他们的过滤系统,然后使用我自己精心制作的消毒剂和验证器(是的,我在通用 sanitizers/validators 之上同时使用 FILTER_CALLBACKFILTER_VALIDATE_REGEXP)。当我处理 HTML 表单时尤其如此,因为我不再使用 $_POST 和 $_GET。我使用 filter_input_array() .

所以,Smithyyy 先生,不要重新发明轮子,而是要为自己考虑。使用 PHP 过滤系统的关键是创建一个系统,对于某些人(比如我)来说,这意味着将过滤功能包装在 class 中。使用可能存储预定义过滤器的各种 class 属性,可以想象一个系统,其中使用循环的各种方法过滤所有数据,为您留下一个好数组或坏数组的最终输出(您可以根据您的具体情况采取行动)。但是,正如 Perl 社区的 Wall 先生所说,"There's more than one way to do it."

Filters 确实非常有用,如果您可以避免使用经典的字符串方法或正则表达式,请毫不犹豫地使用它们。

遗憾的是,无法为每种格式预定义过滤器!

这就是为什么有两个特殊过滤器:FILTER_VALIDATE_REGEXPFILTER_CALLBACK (最后一个不是真正的验证过滤器,但没有禁止回调函数到 return a boolean) 构建所有缺失的验证过滤器。但是当你需要使用这两个特殊过滤器时,情况与之前并没有什么不同 PHP 5.2.

在我看来,filter_vars 的主要目标是为验证和过滤任务提供尽可能方便,但特别是 独特 的方式。我认为性能方面完全是次要的。

关于电子邮件和网址:

FILTER_VALIDATE_URLFILTER_VALIDATE_EMAIL 无法验证所有可能的电子邮件或 url,但您将使用正则表达式方法或其他自制字符串验证来试验相同的问题(可能还有其他限制) .

URL 和 EMAIL 验证都患有相同的疾病:存在多个 RFC(出于不同的原因:更新、国际化)描述了这些格式,这些格式很复杂、不为人知且传播不均且受应用程序支持。

同样,很难构建代码或模式来快速验证它们。您可以看到的电子邮件或 URL 的模式在不同程度上是最常见格式和最奇特格式之间的折衷。

此外,URL 或电子邮件的易变性使得唯一万无一失的验证方法是验证它是否确实存在。所以验证格式只是验证过程的一个步骤,必须相对化。