PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法

举报
lxw1844912514 发表于 2022/03/28 00:28:53 2022/03/28
1.3k+ 0 0
【摘要】 今天本地调用一个接口报错了: filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED is deprecated 但测试环境没有报错,于是查看了一下测试环境的 PHP 版本,是7.1.5,而我开发机的 PHP 版本...

今天本地调用一个接口报错了:

filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED is deprecated
 

但测试环境没有报错,于是查看了一下测试环境的 PHP 版本,是7.1.5,而我开发机的 PHP 版本是7.3.4。

再去看 PHP 手册关于 FILTER_FLAG_SCHEME_REQUIRED 的介绍,Changelog里“赤裸裸”地写着:

7.3.0     The explicit usage of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED has been deprecated.

好吧, FILTER_FLAG_SCHEME_REQUIRED 这个过滤器已经从7.3.0开始被弃用了,那就只能改造一下调用的方法了,代码如下:


      private function prependMissingScheme($host) {
         if (!filter_var($host, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED)) {
             $host = 'http://' . $host;
          }
         return $host;
      }
  
 

FILTER_FLAG_SCHEME_REQUIRED是干嘛用的呢?可以看一下FILTER_VALIDATE_URL,它也是一个过滤器,把值作为 URL 来验证,有以下几个标识:

  • FILTER_FLAG_SCHEME_REQUIRED - 要求 URL 是 RFC 兼容 URL(比如 http://example)

  • FILTER_FLAG_HOST_REQUIRED - 要求 URL 包含主机名(比如 http://www.example.com)

  • FILTER_FLAG_PATH_REQUIRED - 要求 URL 在域名后存在路径(比如 www.example.com/example1/test2/)

  • FILTER_FLAG_QUERY_REQUIRED - 要求 URL 存在查询字符串(比如 "example.php?name=Peter&age=37")

也就是说,代码中的filter_val()方法是想判断变量 $host 有没有形似于“http://”或“https://”的内容,如果没有,就拼接一个“http://”字符串。

既然从7.3.0版本开始无法用FILTER_FLAG_SCHEME_REQUIRED了,可以用什么函数代替呢?翻手册找到了parse_url(),这个函数用来解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。语法如下:

parse_url ( string $url [, int $component = -1 ] ) : mixed 

PHP手册关于parse_url()有这样一段说明:

Specify one of PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY or PHP_URL_FRAGMENT to retrieve just a specific URL component as a string (except when PHP_URL_PORT is given, in which case the return value will be an integer).

看!PHP_URL_SCHEME!是不是和已经弃用的 FILTER_FLAG_SCHEME_REQUIRED 很像?!手册也给出了例子:


      <?php
      $url = 'http://username:password@hostname:9090/path?arg=value#anchor';
      print_r(parse_url($url));
      // Array ( [scheme] => http [host] => hostname [port] => 9090 [user] => username 
      [pass] => password [path] => /path [query] => arg=value [fragment] => anchor )
      print_r(parse_url($url, PHP_URL_SCHEME)); // http
      print_r(parse_url($url, PHP_URL_USER)); // username
      print_r(parse_url($url, PHP_URL_PASS)); // password
      print_r(parse_url($url, PHP_URL_HOST)); // hostname
      print_r(parse_url($url, PHP_URL_PORT)); // 9090
      print_r(parse_url($url, PHP_URL_PATH)); // /path
      print_r(parse_url($url, PHP_URL_QUERY)); // arg=value
      print_r(parse_url($url, PHP_URL_FRAGMENT)); // anchor
  
 

所以可以用parse_url()函数配合 PHP_URL_SCHEME 验证即可。


      private function prependMissingScheme($host){
         // 也可以写成
         // if (!isset(parse_url($host)['scheme'])) {
         if (empty(parse_url($host, PHP_URL_SCHEME)) {
             $host = 'http://' . $host;
          }
         return $host;
      }
  
 

需要注意的是,parse_url()不能验证给定 URL 的合法性,只是将给定的 URL 分解为上面列出的各部分。不完整的 URL 也被接受,parse_url()会尝试尽量正确地将其解析。

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/120760035

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。