今天本地调用一个接口报错了:
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)); //
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()会尝试尽量正确地将其解析。

PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法的更多相关文章

  1. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  2. JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法

    今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...

  3. Linux 出现telnet: 127.0.0.1: Connection refused错误解决办法

    Linux 出现telnet: connect to address 127.0.0.1: Connection refused错误解决办法 没有xinetd服务: 1./etc/init.d目录中放 ...

  4. The specified framework 'Microsoft.NETCore.App', version '1.0.1' was not found 解决办法

    环境:Centos 7 已经下载安装.NET Core 1.1 Microsoft .NET Core Shared Framework Host Version : Build : 928f77c4 ...

  5. VC++6.0打开文件出错的解决办法

    1.下载http://support.microsoft.com/kb/241396里面的一个叫FileTool.exe的文件并解压,解压后是一个vc工程,用vc6.0打开工程,编译,得到FileTo ...

  6. 转:Selenium2.0 click()不生效的解决办法

    除了http://573301735.com/?p=5126讲的,昨天又发现一个让我1个小时生不如死的问题,就是使用两个不同的配置文件来初始化driver,findelement方法获取到的坐标居然不 ...

  7. 对‘TIFFReadDirectory@LIBTIFF_4.0’未定义的引用-------------- 解决办法

    ABLE_DEPRECATED' is defined [-Winvalid-pch] //usr/lib/libvtkIO.so.5.10:对‘TIFFReadDirectory@LIBTIFF_4 ...

  8. Unity3d导入3dmax后model 的缩放为0.0254的原因以及解决办法

    http://blog.csdn.net/pdw_jsp/article/details/51259493 这个问题其实已经早都出现过了,今天我们这边也碰到了,这里做个记录吧 导致的问题~ 场景的比例 ...

  9. DotNetCore.1.0.1-VS2015Tools.Preview2.0.3 相关问题及解决办法

    本月16号,MS发布了 .NET Core 1.1.作为一个用贯MS产品的小盆友,我第一时间就把相关的安装包下载下来了,然后果断安装(入坑). 我猜你来看这篇博客可能遇到了和我一样的问题. 问题0:正 ...

随机推荐

  1. fastadmin CMS等系列插件安装不成功的问题

    由于fastadmin开发者  没有做到权限优化问题,导致用户在linux服务器上lnmp环境下安装的fastadmin后台安装插件一直产生权限不足,安装不成功的问题, 再次给大家一个具体解决办法 对 ...

  2. 【转载】UNICODE与ASCII的区别

    原文地址:https://blog.csdn.net/lx697/article/details/5914417 最近的项目涉及到了国际化的问题,由于之前并没有接触到UNICODE编码,因此,在项目期 ...

  3. iview admin动态路由实现

    参考 https://blog.csdn.net/weixin_41538490/article/details/93749942

  4. load address、entry point、 bootm address以及kernel运行地址

    load address:加载地址   load_addr      mkimage -a entry point: 入口地址     entry_point     mkimage -e bootm ...

  5. 201871010110-李华《面向对象程序设计(java)》第四周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  6. Codeforces Round #609 (Div. 2) A到C题

    签到,乘以两个相邻的合数 #include<bits/stdc++.h> using namespace std; int main(int argc, char const *argv[ ...

  7. Jmeter做webservices接口测试

    在Soap/XML-RPC Data中输入: <?xml version="1.0" encoding="utf-8"?> <soap12:E ...

  8. 洛谷P4549 裴蜀定理 / Min

    原题链接 题目描述 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1X1+...AnXn>0,且S的值最小 输入输出格式 输入格式: 第一行给出数字N,代表有N个数 下 ...

  9. 05-numpy-笔记-fliplr

    翻转矩阵的左右. 至少需要是2维矩阵. 例子: >>> A = np.diag([1.,2.,3.]) >>> A array([[ 1., 0., 0.], [ ...

  10. pointnet

    无序性:虽然输入的点云是有顺序的,但是显然这个顺序不应当影响结果.点之间的交互:每个点不是独立的,而是与其周围的一些点共同蕴含了一些信息,因而模型应当能够抓住局部的结构和局部之间的交互.变换不变性:比 ...