边缘案例 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' -> 现在这是路径还是域?
我最近 运行 遇到了 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
parse_url
需要信息
这就是 parse_url('//domain/path')
工作的原因 -> 它不会输出任何模式。
现在描述您要解决的问题:php 需要知道存在的每个域,然后才能确定这是否是用户想要的(基本上不可能)
例如以下 url:'http://whois.domaintools.com/test.at' -> 如果我只传递路径,它将写入 'test.at' -> 现在这是路径还是域?