- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
早上好
我正在转换我正在处理的网站以与最新版本的 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/
我想知道我们是否可以替换 if(preg_match('/boo/', $anything) 和 preg_match('/poo/', $anything)) 用正则表达式.. $anything
假设字符串是: $a = "abc-def" if (preg_match("/[^a-z0-9]/i", $a, $m)){ $i = "i stopped scanning '$a' beca
好的,所以我希望用户能够输入 A-Z 中的每个字符和 0-9 中的每个数字,但我不希望他们输入“特殊字符”。 代码: if (preg_match("/^[a-zA-Z0-9]$/", $user_n
我想使用 preg_match 来查找括号之间的文本,例如:$varx = "(xx)"; 最终输出将是 $match = 'xx'; 另一个例子$varx = "bla bla (yy) bla b
嘿伙计们,我正在尝试删除最后一个 _1.jpg 如果它存在于我的表达中,但我遇到了一些麻烦 场景如下。 image_name_1.jpg(应该是image_name.jpg) image_name_1
我需要修复这个 preg_match("/^[[0-9]{0,4}$/i", $input),它还需要接受负值。谢谢 最佳答案 if (preg_match('/^-?[0-9]{1,4}$/', $
我正在尝试提出一个符合 25 的正则表达式在这个字符串中: Always - 25 (Lifetime - 之间的空间量和 25可以是可变的,但尾随 (Lifetime将永远在
我试图通过仅过滤掉符合以下条件的单词来匹配字符串中的关键字: 任何地方都有大写字母的单词,例如“iPhone”或“camelCase” 连续大写的词组,例如“Pittsburgh Steelers”或
我在 mysql 字段中有此数据: First text text text text text text text text text text text text text text tex
我有这个代码 preg_match("/\bHTTP(.)+ (\d{3})/", $string) 在最后一个模式中,我必须检查一个可以由任何数字组成但不应该创建像 404 或 401 这样的数字的
你好,我想匹配下一行中的“@”, create@create_time:"2012-05-30 21:14:35.0",update_time:"2012-05-31 22:05:46.0" preg
我使用“或”运算符“|”只匹配 $name 变量的单词 $name = "one five six two"; if (preg_match('/(one|two)/i', $name)) {retu
大家好 我有一个字符串 Open Directory Sites (1-20 of 10000) 我需要得到 10000 作为答案.. 我如何使用 preg_match ???注意:这是重要的,匹配的
我想使用 preg_match 为带括号的子模式返回每个匹配项的数组。 我有这个代码: $input = '[one][two][three]'; if ( preg_match('/
我有一个像这样值的变量: $sentence = "When it comes time to renew your auto insurance policy, be aware of how yo
我只想允许使用字母、数字、空格、无色线和连字符。 到目前为止,我认为这个 preg_match 可以完成这项工作: if(preg_match('/[^a-z0-9 _]+$/i', $name))
这个问题与this直接相关我大约 15 分钟前提出的问题。这不是要与那个帖子重复,而是希望这更多是一种学习经验。 在提出的问题中,我试图找出导致 preg_match no deliminator f
我有以下字符串 № покупки(OrderId) : 12345 Доп.Информация 1 : Имя Доп.Информация 2 : Уставная деятельность 我
我正在尝试为我们的防火墙创建报告功能。 防火墙规则以 json 格式存储。 这是字符串的示例。 [{"id":1,"enabled":true,"description":"TEMP","matche
在多个模式的情况下,可以在相同的数组索引下返回 preg_match 的结果。我的意思是我有以下 preg_match 什么正在检查不同子字符串( '&q' 、 '?q' 、 '&keywords'
我是一名优秀的程序员,十分优秀!