PHP模式仍然是必需的,或者filter_var是否会处理这一切


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

今天早上我在读一篇文章的时候看到了这个

大多数人倾向于认为数据验证是一件非常繁琐的事情

比较他们想要验证的所有可能的数据他们能想到的组合。试图找到一个金色的常规表达式匹配所有可能的组合。
一个组合两个中的一个。
以上所列有明显的问题:

这绝对是费时的。出错的可能性非常高。幸运的是,从5.2版本开始,PHP包含了一个很棒的函数filter_var消除了数据的痛苦验证。

模式仍然是必要的还是filter_var只是做所有的。

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

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

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

真正的问题是你是否愿意购买并接受 PHP过滤系统建立的"过滤框架/方法"。我做了什么?我使用他们的过滤系统作为第一步,然后使用我自己精心制作的消毒器和验证器(是的,我在通用的消毒器/验证器之上使用FILTER_CALLBACKFILTER_VALIDATE_REGEXP)。在处理HTML表单时尤其如此,因为我不再使用$_POST和$_GET。我使用filter_input_array() . 所以,史密斯先生,不要再做无谓的重复工作了,要独立思考。使用PHP过滤器系统的关键是创建一个系统,对于一些人(比如我)来说,这意味着将过滤器函数包装在类中。使用可能存储预定义过滤器的各种类属性,可以想象一个系统,其中使用循环的各种方法过滤所有数据,为您留下一个好的或坏的数组的最终输出(您可以根据您的特定情况对其采取行动)。但是,正如Perl社区的Wall先生所指出的,"有不止一种方法可以做到这一点。"

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

不幸的是,不可能为每种格式预定义一个过滤器!

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

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

关于email和url:

FILTER_VALIDATE_URLFILTER_VALIDATE_EMAIL无法验证所有可能的电子邮件或url,但是您可以使用regex方法或其他自制的字符串验证来尝试同样的问题(可能有其他限制)。

URL和EMAIL验证都有同样的问题:存在几个RFC(出于不同的原因:update,国际化),它们描述了这些复杂的,不为人所熟知的,不均匀分布和应用程序支持的格式。

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

此外,URL或电子邮件的波动性使得唯一万无一失的验证方法是验证它是否真的存在。因此,验证格式只是验证过程中的一个步骤,必须相对化。