【PHP小课堂】简朴入门PHP中的过滤器相干函数

打印 上一主题 下一主题

主题 1050|帖子 1050|积分 3150

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
简朴入门PHP中的过滤器相干函数

  一般在业务开发中,我们对于一些参数数据的过滤大部门照旧使用传统的 if 以及正则进行判断过滤。但其实 PHP 中也提供了一些过滤器,可以资助我们方便地进行数据的过滤筛选以及部门替换操作。今天我们就来简朴的学习一下这些函数的使用。
  过滤函数

  起首照旧从代码入手,过滤器这块的参数设置比力丰富,我们不会一一的解说,只通过例子进行简朴的了解即可,更复杂的应用各人可以自行查阅相干的文档。
  1. $int1 = 1;
  2. $int2 = -1;
  3. $int3 = "3";
  4. $options = [
  5.     'options' => [
  6.         'min_range' => 0,
  7.         'max_range' => 3,
  8.     ],
  9. ];
  10. var_dump(filter_var($int1, FILTER_VALIDATE_INT, $options)); // int(1)
  11. var_dump(filter_var($int2, FILTER_VALIDATE_INT, $options)); // bool(false)
  12. var_dump(filter_var($int3, FILTER_VALIDATE_INT, $options)); // int(3)
复制代码
这段代码是针对数字范例的过滤,使用的是 filter_var() 函数。从函数的名称就可以看出,这个函数的作用就是过滤变量。在这段测试代码中,我们使用了 FILTER_VALIDATE_INT 这个常量参数,它的意思就是过滤验证整数范例。然后我们还为它指定了一个 options ,也就是一个选项参数,里面设置了数字过滤的范围是 0 到 3 。
  输出的结果和我们预期的一样,假如没有被过滤掉,这个 filter_var() 返回的就是原来的数据,假如被过滤掉了,那么它返回的就是一个 false 。除了数字范例的过滤操作之外,还比力常用的就是邮件地点的过滤操作。
  1. $email1 = 'a@b.com';
  2. $email2 = 'a.b.com';
  3. $email3 = '(a@b.com)';
  4. var_dump(filter_var($email1, FILTER_VALIDATE_EMAIL)); // string(7) "a@b.com"
  5. var_dump(filter_var($email2, FILTER_VALIDATE_EMAIL)); // bool(false)
  6. var_dump(filter_var($email3, FILTER_VALIDATE_EMAIL)); // bool(false)
复制代码
很明显,只要将 FILTER_VALIDATE_INT 换成 FILTER_VALIDATE_EMAIL 就可以实现标准邮件地点的过滤操作。而 options 也可以看出是一个可选的参数,在这段测试代码中我们并没有使用这个参数。
  1. $sanitized = filter_var($email3, FILTER_SANITIZE_EMAIL);
  2. var_dump($sanitized); // string(7) "a@b.com"
复制代码
上文中说过,过滤相干的函数还可以实现简朴的替换过滤操作,这里我们使用 FILTER_SANITIZE_EMAIL 就可以将数据替换成正常的邮件地点。SANITIZE 的意思是消毒、净化的意思,所以带 SANITIZE 相干的常量参数都是有这种净化的作用,也就是清除一些无用的字符。FILTER_SANITIZE_EMAIL 会清除除了标准字符、数字以及  !#$%&'*+-=?^_`~@.[] 这些符号之外的其它字符。好比我们上面这段代码中就是把 email3 中的小括号给清撤除了。
  批量过滤

  filter_var() 的作用是过滤一个变量的内容,在 PHP 中,也为我们提供了批量过滤数据的函数,它可以批量过滤指定数组中的数据。
  1. $data = [
  2.     'product_id' => 'libgd<script>',
  3.     'component' => '10',
  4.     'versions' => '2.0.33',
  5.     'testscalar' => ['2', '23', '10', '12'],
  6.     'testarray' => '2',
  7. ];
  8. $args = [
  9.     'product_id' => FILTER_SANITIZE_ENCODED,
  10.     'component' => [
  11.         'filter' => FILTER_VALIDATE_INT,
  12.         'flags' => FILTER_FORCE_ARRAY,
  13.         'options' => ['min_range' => 1, 'max_range' => 10],
  14.     ],
  15.     'versions' => FILTER_SANITIZE_ENCODED,
  16.     'doesnotexist' => FILTER_VALIDATE_INT,
  17.     'testscalar' => [
  18.         'filter' => FILTER_VALIDATE_INT,
  19.         'flags' => FILTER_REQUIRE_SCALAR,
  20.     ],
  21.     'testarray' => [
  22.         'filter' => FILTER_VALIDATE_INT,
  23.         'flags' => FILTER_FORCE_ARRAY,
  24.     ],
  25. ];
  26. print_r(filter_var_array($data, $args));
  27. // Array
  28. // (
  29. //     [product_id] => libgd%3Cscript%3E
  30. //     [component] => Array
  31. //         (
  32. //             [0] => 10
  33. //         )
  34. //     [versions] => 2.0.33
  35. //     [doesnotexist] =>
  36. //     [testscalar] =>
  37. //     [testarray] => Array
  38. //         (
  39. //             [0] => 2
  40. //         )
  41. // )
复制代码
这段代码使用的 filter_var_array() 看起来很复杂,其实和 filter_var() 的意思是差不多的,只是第一个参数变成了一个数组,而第二个参数也是一个数组的设置选项。两个数组的键要对应上,如许才能针对第一个数据数组中的数据进行过滤操作。
  设置选项的数组中,默认情况下可以只给一个过滤常量,也可以通过一个二维数组通过 filter 字段指定过滤常量。同样地,在这个设置二维数组中可以指定 flags 和 options 。关于这三个字段的说明我们将在下节解说。
  在这段测试代码中, FILTER_SANITIZE_ENCODED 表现整理并编码数据。FILTER_FORCE_ARRAY 表现标记为数组,返回的结果会变成一个数组。FILTER_REQUIRE_SCALAR 表现返回一个标量字段,也就是必须是一个标题范例,不能是数组大概对象之类的内容。
  过滤组件中的这些常量参数比力多,各人可以参考文档在现实应用中选择需要的常量。
  过滤参数的说明

  在上面的测试代码中,我们已经见过有几种范例的设置选项。好比 filter 、 flags 、options 。它们都是干什么用的呢?
  Validation

  Filter 相干的参数常量又分为 Validation 和 Sanitization 这两种范例。在上面的测试代码里面我们都已经见过了。
  Validation 范例的,好比上面的 FILTER_VALIDATE_INT 这种,重要就是验证数据,作用于 filter_var() 大概 filter_var_array() 之后,假如数据不符合规则的话,就会返回 false 结果,假如数据通过的话,就返回原始的数据信息。
  Sanitize

  Sanitization 范例的,好比上面的 FILTER_SANITIZE_ENCODED ,就是前面说过的整理数据,可以通过删除不需要的字符来更改数据。留意,它不验证数据,只是整理更改。
  Flags

  Flags 是可以和 Validation 以及 Sanitization 配合使用的一种标记参数,大概可以说是针对于这两种设置参数的一个扩展,可以提供一些额外的功能。好比我们上面代码中使用到的 FILTER_REQUIRE_SCALAR 。
  具体的这些参数的信息,可以在官方文档的 Types of filters 中看到。另外尚有一个 options ,可以用于设置一些选项信息,使用得比力多的就是在上面测试中界说数字范例的区间 min_range 和 max_range 。
  全局请求参数过滤

  讲完了一些设置信息的基础说明之后,我们再来看看其它函数的使用。
  1. $_GET['a'] = "I'm the One!";
  2. // php -S localhost:9991 6.一起学习PHP中的过滤器相关函数.php
  3. // http://localhost:9991/?a=I'm the one
  4. var_dump(filter_has_var(INPUT_GET, 'a')); // bool(true)
  5. var_dump(filter_has_var(INPUT_GET, 'g')); // bool(false)
复制代码
filter_has_var() 用于判断指定的全局数据范围内某个数据是否存在。从这个 INPUT_GET 就可以看出,它判断的是 GET 请求参数中是否存在某个数据。假如我们通过代码直接给 $_GET 赋值的话,这个函数返回的也是 false 。也就是说,它判断的结果必须是正式从外面传递过来的数据。因此,我们可以再启动一个本地服务,然后通过 url 参数来进行测试。
  1. $queryA = filter_input(INPUT_GET, 'a', FILTER_SANITIZE_ENCODED);
  2. echo $queryA;
  3. // I%27m%20the%20one
复制代码
filter_input() 的使用和 filter_has_var() 雷同,不过它是起到了过滤使用的函数。就像 filter_var() 一样,这个函数针对的是全局变量中的数据。同样地,它也有批量过滤的函数可以使用。
  1. $args = [
  2.     'a'=>FILTER_SANITIZE_ENCODED,
  3.     'b'=>FILTER_VALIDATE_DOMAIN,
  4.     'c'=>FILTER_VALIDATE_EMAIL,
  5.     'd'=>[
  6.         'filter'=>FILTER_SANITIZE_NUMBER_INT,
  7.     ]
  8. ];
  9. print_r(filter_input_array(INPUT_GET, $args));
  10. // http://localhost:9991/?a=I'm the one@&b=opq.com.cn&c=ab.ab&d=foo baz 123
  11. // Array
  12. // (
  13. //     [a] => I%27m%20the%20one%20%40
  14. //     [b] => opq.com.cn
  15. //     [c] => 
  16. //     [d] => 123
  17. // )
复制代码
上述的这三个函数不仅可以吸收 INPUT_GET ,还可以吸收 INPUT_POST 、 INPUT_COOKIE 、INPUT_SERVER 以及 INPUT_ENV 这些参数。信赖这个就不消多解释了,从名称就可以看出来这些参数代表的是什么意思。
  其它相干函数

  另外尚有两个比力简朴的函数,我们直接来看看它们的作用了解一下即可。
  1. print_r(filter_list());
  2. // Array
  3. // (
  4. //     [0] => int
  5. //     [1] => boolean
  6. //     [2] => float
  7. //     [3] => validate_regexp
  8. //     [4] => validate_domain
  9. //     [5] => validate_url
  10. //     [6] => validate_email
  11. //     [7] => validate_ip
  12. //     [8] => validate_mac
  13. //     [9] => string
  14. //     [10] => stripped
  15. //     [11] => encoded
  16. //     [12] => special_chars
  17. //     [13] => full_special_chars
  18. //     [14] => unsafe_raw
  19. //     [15] => email
  20. //     [16] => url
  21. //     [17] => number_int
  22. //     [18] => number_float
  23. //     [19] => magic_quotes
  24. //     [20] => add_slashes
  25. //     [21] => callback
  26. // )
复制代码
用于返回所支持的过滤器列表,其实根据这些名字加上 FILTER_VALIDATE_ 就是这个过滤器的常量名称。但其实这些常量在源码中界说的都是一个数字符号。
  1. var_dump(FILTER_SANITIZE_FULL_SPECIAL_CHARS); // int(522)
复制代码
当然,它是把 VALIDATE 和 SANITIZE 混合在一起的,好比这个 FILTER_SANITIZE_FULL_SPECIAL_CHARS 是属于 SANITIZE 中的常量参数。不过我们有另外一个函数可以获得这些常量参数对应的数字符号。
  1. foreach (filter_list() as $f) {
  2.     echo filter_id($f), PHP_EOL;
  3. }
  4. // 257
  5. // 258
  6. // 259
  7. // 272
  8. // 277
  9. // 273
  10. // 274
  11. // 275
  12. // 276
  13. // 513
  14. // 513
  15. // 514
  16. // 515
  17. // 522
  18. // 516
  19. // 517
  20. // 518
  21. // 519
  22. // 520
  23. // 521
  24. // 523
  25. // 1024
复制代码
filter_id() 函数就是根据过滤器的名称获得这个过滤器的数字符号的函数,大概说这个数字符号就是这个过滤器的 id 。可以看到,522 也是包含在打印出来的数据中的。
  总结

  怎么样,这一套过滤相干的扩展函数是不是有点意思,各人可以多尝试在现实的业务代码中应用它们。这些函数是 PHP 中的默认函数,不需要额外的编译安装,上手就可以使用,非常地方便。
  测试代码:
  https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/04/source/6.%E7%AE%80%E5%8D%95%E5%85%A5%E9%97%A8PHP%E4%B8%AD%E7%9A%84%E8%BF%87%E6%BB%A4%E5%99%A8%E7%9B%B8%E5%85%B3%E5%87%BD%E6%95%B0.php
  参考文档:
  https://www.php.net/manual/zh/book.filter.php

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表