PHP仍然是必需的模式,或者filter_var负责这一切

时间:2015-05-31 18:29:52

标签: php regex filter-var

今天早上我正在阅读一篇文章时,我遇到了这个

  

大多数人倾向于认为数据验证非常繁琐   过程中的一个:

     

将他们想要验证的数据与每种可能的数据进行比较   他们可以想到的组合。试图找到一个金色的常规   表达式将匹配每个可能的组合。
一个组合   两个。
上面列出了明显的问题:

     

这绝对是耗时的。错误的可能性很高。   幸运的是,从5.2版本开始,PHP已经包含了很多功能   名为filter_var的函数可以消除数据的痛苦   验证

模式是否仍然需要或filter_var只是完成所有工作。

2 个答案:

答案 0 :(得分:2)

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

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

PHP过滤器创建者理解一种尺寸适合所有人是不切实际的主张。因此,您可以使用FILTER_CALLBACKFILTER_VALIDATE_REGEXP自己的验证过滤器提供自己的清理/验证过滤器。我们回到原点吗?我们生活得更好吗?

真正的问题是你是否愿意买进并接受过滤框架/方法"由PHP过滤系统建立。我呢?我使用他们的过滤系统作为第一次通过,然后我使用我自己精心设计的消毒剂和验证器(是的,我在通用消毒剂/验证器之上使用FILTER_CALLBACKFILTER_VALIDATE_REGEXP。在处理HTML表单时尤其如此,因为我不再使用$ _POST和$ _GET。我使用filter_input_array()

所以,史密斯先生,不要重新发明轮子,但要自己思考。使用PHP过滤系统的关键是创建一个系统,对于某些人(比如我)来说,这意味着在类中包装过滤器函数。使用可能存储预定义过滤器的各种类属性,可以想象一个系统,其中各种方法,使用循环,过滤所有数据,留下一个好的数组的最终输出,或一个坏的(你可以采取行动,根据您的具体情况而定)。但是,正如Perl社区的Wall先生所指出的那样,"有不止一种方法可以做到这一点。"

答案 1 :(得分:1)

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

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

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

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

关于电子邮件和网址:

FILTER_VALIDATE_URLFILTER_VALIDATE_EMAIL无法验证所有可能的电子邮件或网址,但您会使用正则表达式方法或其他自制字符串验证来尝试相同的问题(可能还有其他限制)。< / p>

URL和EMAIL验证遭受同样的疾病:存在若干RFC(出于不同的原因:更新,国际化),这些RFC描述了这些格式复杂,不为人知,并且应用程序不均匀传播和支持。

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

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