WordPress Version: 4.4
/**
* A wrapper for PHP's parse_url() function that handles edgecases in < PHP 5.4.7
*
* PHP 5.4.7 expanded parse_url()'s ability to handle non-absolute url's, including
* schemeless and relative url's with :// in the path, this works around those
* limitations providing a standard output on PHP 5.2~5.4+.
*
* Error suppression is used as prior to PHP 5.3.3, an E_WARNING would be generated
* when URL parsing failed.
*
* @since 4.4.0
*
* @param string $url The URL to parse.
* @return bool|array False on failure; Array of URL components on success;
* See parse_url()'s return values.
*/
function wp_parse_url($url)
{
$parts = @parse_url($url);
if (!$parts) {
// < PHP 5.4.7 compat, trouble with relative paths including a scheme break in the path
if ('/' == $url[0] && false !== strpos($url, '://')) {
// Since we know it's a relative path, prefix with a scheme/host placeholder and try again
if (!$parts = @parse_url('placeholder://placeholder' . $url)) {
return $parts;
}
// Remove the placeholder values
unset($parts['scheme'], $parts['host']);
} else {
return $parts;
}
}
// < PHP 5.4.7 compat, doesn't detect schemeless URL's host field
if ('//' == substr($url, 0, 2) && !isset($parts['host'])) {
$path_parts = explode('/', substr($parts['path'], 2), 2);
$parts['host'] = $path_parts[0];
if (isset($path_parts[1])) {
$parts['path'] = '/' . $path_parts[1];
} else {
unset($parts['path']);
}
}
return $parts;
}