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 来验证,有以下几个标识:
<?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()会尝试尽量正确地将其解析。
PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法
原文:https://www.cnblogs.com/sunshineliulu/p/11042746.html