草庐IT

php - filter_var 与 preg_match

coder 2024-04-29 原文

早上好

我正在转换我正在处理的网站以与最新版本的 PHP 兼容,因此我正在检查并用未折旧的等效项替换所有 ereg 实例。然而,有人告诉我有一个名为 filter_var 的方便的 PHP 内置函数。

我的问题是,使用 filter_var 而不是 preg_match 是否有意义?至于选择一个而不是另一个是否有性能提升或任何其他好处,如果有的话,它们是什么?

最佳答案

首先,关于过滤的 PHP 手册页:https://php.net/manual/en/book.filter.php

其次,上下文是关键。一般来说,过滤器函数被设计为使用外部输入(标量或数组),或内部输入。外部输入来自 HTTP 请求/PHP 引擎或表单提交等来源。

带有 filter_input 前缀的过滤函数允许您完全绕过 $_SERVER、$_COOKIE、$_POST 和 $_GET 超全局变量。虽然您通常会指定要从“何处”获取数据,但过滤函数不会明确使用 $_POST、$_GET、$_COOKIE 和$_SERVER。您对变量/数组元素所做的更改不会显示在 $_GET、$_POST 或 $_SERVER 中,因此以这种方式使用过滤器是一种范式转变,可能会显着改变您的应用程序的流程。换句话说,您必须自己跟踪外部输入。我这样做是为了对外部输入进行初始清理(剥离、替换、更改等)。我不再使用 $_POST、$_GET 或 $_SERVER。尽管如此,我仍然使用 $_FILES。

filter_var 为前缀的函数用于过滤程序中已存在的任何通用数组。我在使用 filter_input 之后使用它。您可以在这两种情况下使用许多过滤器,但您的问题是关于性能

如果您选择将 FILTER_VALIDATE_REGEXP 过滤器与任何过滤函数一起使用,我无法想象这种间接方法比直接使用 preg_match() 更有效。就其他过滤器而言,如果它们只是从正则表达式调用中删除了“n”个方法/函数,我也看不到效率的提高

我认为过滤器功能旨在帮助提高跨许多应用程序发生的过滤任务的一致性。它们可能不是为了更高效而设计的,但它们肯定是为了比正则表达式更可访问而设计的(尽管我非常擅长正则表达式)。我更喜欢直接了解正在发生的事情,但有些人不关心或可能不关心。但是,过滤器功能为那些不了解正则表达式和其他基本 Web 应用程序安全流程的人打开了过滤字符串的大门。

不过,人们当然可以不使用过滤功能。

此外,我将过滤器函数与我自己的 sanitizer 和验证器类结合使用。所以,我不是要 PHP 为我思考,我只是用它来增强我已经知道该怎么做的功能(以防它们的功能得到我想念的东西)。纵深防御。

总而言之,您最好的选择就是简单地使用 preg_match(),除非您打算改变流程(filter_input 函数)输入到您的应用程序中。即使那样,也不会有性能提升,但您可以绕过 $_SERVER、$_POST 和 $_GET。此外,您还可以利用更简单、结构化、一致的过滤功能,并能够使用回调函数 (FILTER_CALLBACK) 来调用自定义的内部方法/函数(我也这样做) .此外,您仍然可以使用您自己的正则表达式和使用 FILTER_VALIDATE_REGEXP 过滤器的过滤器函数,但同样,我认为没有理由相信如果您这样做,您的应用程序的性能会提高。可维护性?可能是。这取决于编写代码的人。

关于php - filter_var 与 preg_match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1544214/

有关php - filter_var 与 preg_match的更多相关文章

  1. ruby - 怎么来的(a_method || :other) returns :other only when assigning to a var called a_method? - 2

    给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R

  2. ruby-on-rails - before_filter 运行多个方法 - 2

    是否有可能:before_filter:authenticate_user!||:authenticate_admin! 最佳答案 before_filter:do_authenticationdefdo_authenticationauthenticate_user!||authenticate_admin!end 关于ruby-on-rails-before_filter运行多个方法,我们在StackOverflow上找到一个类似的问题: https://

  3. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  4. ruby - 为什么 `Symbol#match` 的行为与 `String#match` 和 `Regexp#match` 不同? - 2

    String#match和Regexp#match在匹配成功时返回一个MatchData:"".match(//)#=>#//.match("")#=>#//.match(:"")#=>#但是Symbol#match返回匹配位置(如String#=~)::"".match(//)#=>0为什么Symbol#match表现不同?有用例吗? 最佳答案 我将其报告为Ruby核心中的错误:https://bugs.ruby-lang.org/issues/11991.让我们看看他们会怎么说。更新被质疑的行为似乎是一个错误。似乎从Ruby2.

  5. ruby , `match' : invalid byte sequence in UTF-8 - 2

    我对UTF-8编码有一些问题。我在这里阅读了一些帖子,但它仍然无法正常工作。这是我的代码:#!/bin/envruby#encoding:utf-8defdeterminefile=File.open("/home/lala.txt")file.eachdo|line|puts(line)type=line.match(/DOG/)puts('aaaaa')iftype!=nilputs(type[0])breakendendend这是我文件的前3行:;?lalalalal60000065535-1362490443-0000006334-0000018467-0000000041en

  6. ruby-on-rails - connect() 到 unix :/var/run/unicorn. 连接到上游时 sock 失败(111:连接被拒绝) - 2

    我遵循ruby​​onrails一个应用程序点击部署。数据库做得很好,即使我检查Rails控制台一切正常017/02/2615:34:17[error]18564#0:*31connect()tounix:/var/run/unicorn.sockfailed(111:Connectionrefused)whileconnectingtoupstream,client:121.52.156.57,server:_,request:"GET/HTTP/1.1",upstream:"http://unix:/var/run/unicorn.sock:/",host:"188.166.157

  7. ruby-on-rails - Rails 查询 : Filter by properties in another table - 2

    我正在寻找一个清晰的Rails4示例,说明如何根据通过另一个表关联的数据过滤记录。假设我有一个用户模型和一个评论模型。一个用户has_many评论,一个Commentbelongs_to一个用户。评论在其表中也有一个score列。classUserUsers|id|name|email||-----|---------|---------------------||1|"Alice"|"alice@example.com"||2|"Bob"|"bob@example.com"||...|classComment我如何获得所有对内容“k”发表评论且分数>0的用户?请注意,我要返回的是用户

  8. No loop matching the specified signature and casting was found for ufunc greater - 2

    目录报错信息np.greater学习临时解决方法:np.greater去掉dtype报错信息pipinstallnumpy==1.24报错代码:dda=np.cumsum(np.greater(counts,0),dtype=np.int32)print(dda)Noloopmatchingthespecifiedsignatureandcastingwasfoundforufuncgreaternp.greater学习1.函数功能:判断参数一是否大于参数二。2.参数介绍  arr1:第一个参数类似一个数组  arr2:第二个参数类似一个数组  out:返回值是bool类型或者是元素为bool

  9. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  10. ruby - 真正的 sinatra(ruby/rack) after_filter 最快的方法是什么? - 2

    好的,这是一个简单的任务。在我向客户端呈现html之后,我想使用请求中的信息执行数据库调用。我正在使用sinatra,因为它是一个轻量级的微框架,但我真的支持ruby​​中的任何东西,如果它更快/更容易(Rack?)。我只想获取url并根据url将客户端重定向到其他地方。那么如何使用rack/sinatra作为一个真正的after_filter。after_filter我的意思是在响应发送到客户端之后。还是没有线程就无法实现?我fork了sinatra并在过滤器之后添加,但是没有办法刷新响应,即使是假设流式传输文件(显然是二进制文件)的send_data也在等待after_filter

随机推荐