边缘案例 PHP 错误的最有效修复,parse_url 无方案

Most efficient fix for an edgecase PHP bug, parse_url no scheme

我最近 运行 遇到了 PHP 7.1 中的一个错误,它似乎在 fixed in PHP 5.4.7

之后又回来了

问题很简单,如果你将 url 传递给 parse_url() 而 url 没有方案,它将 return 整个 url 好像它只是一条路径。例如:

var_dump(parse_url('google.co.uk/test'))

结果:

array(1) { ["path"]=> string(12) "google.co.uk/test" }

而实际上这里它应该拆分成它的域和路径。

我 运行 parse_url 每天几千万次作为 url 解密/加密功能的一部分。我正在寻找一种快速修复此 edgecase 错误的方法,或者寻找 parse_url.

的可靠替代方法

编辑:

感谢您的热心回复,这是我最后使用的解决方案,希望对您有所帮助。我不会将其作为答案提交,因为我已经将其他人标记为正确(他们是正确的),这让我可以写这篇文章。

$parsedUrl = parse_url($uri);
// if the uri has no scheme, it won't think there's a host and will give bad results
if ($parsedUrl !== false && !isset($parsedUrl['host'])) {
  // double slash prepended will parse $uri as if it has a schema and no schema will be in the result
  $parsedUrl = parse_url('//' . $uri);
}
if ($parsedUrl === false) {
  throw new MalformedUrlException('Malformed URL: ' . $uri);
}
// use parsed url as needed
如果给定的字符串是 url.

的开头,

parse_url 需要信息

这就是 parse_url('//domain/path') 工作的原因 -> 它不会输出任何模式。

现在描述您要解决的问题:php 需要知道存在的每个域,然后才能确定这是否是用户想要的(基本上不可能)

例如以下 url:'http://whois.domaintools.com/test.at' -> 如果我只传递路径,它将写入 'test.at' -> 现在这是路径还是域?