wp_parse_url( string $url, int $component = -1 ): mixed
A wrapper for PHP’s parse_url() function that handles consistency in the return values across PHP versions.
Description
PHP 5.4.7 expanded parse_url()’s ability to handle non-absolute URLs, including schemeless and relative URLs with "://" in the path. This function works around those limitations providing a standard output on PHP 5.2~5.4+.
Secondly, across various PHP versions, schemeless URLs containing a ":" in the query are being handled inconsistently. This function works around those differences as well.
Parameters
-
$url
string Required -
The URL to parse.
-
$component
int Optional -
The specific component to retrieve. Use one of the PHP predefined constants to specify which one.
Defaults to -1 (= return all parts as an array).Default:
-1
Return
mixed False on parse failure; Array of URL components on success; When a specific component has been requested: null if the component doesn't exist in the given URL; a string or - in the case of PHP_URL_PORT - integer when it does. See parse_url()'s return values.
Source
File: wp-includes/http.php
.
View all references
function wp_parse_url( $url, $component = -1 ) {
$to_unset = array();
$url = (string) $url;
if ( str_starts_with( $url, '//' ) ) {
$to_unset[] = 'scheme';
$url = 'placeholder:' . $url;
} elseif ( str_starts_with( $url, '/' ) ) {
$to_unset[] = 'scheme';
$to_unset[] = 'host';
$url = 'placeholder://placeholder' . $url;
}
$parts = parse_url( $url );
if ( false === $parts ) {
// Parsing failure.
return $parts;
}
// Remove the placeholder values.
foreach ( $to_unset as $key ) {
unset( $parts[ $key ] );
}
return _get_component_from_parsed_url_array( $parts, $component );
}
Changelog
Version | Description |
---|---|
4.7.0 | The $component parameter was added for parity with PHP's parse_url() . |
4.4.0 | Introduced. |
User Contributed Notes
You must log in before being able to contribute a note or feedback.
Example return array
wp_parse_url()
seems to fix a bug ofparse_url()
, where port-like string in URL is incorrectly parsed as a port:For reference, here’s a sample that shows URL parts that are returned by parse_url:
And here’s a list of valid
$component
values:*
PHP_URL_SCHEME
*
PHP_URL_HOST
*
PHP_URL_PORT
*
PHP_URL_USER
*
PHP_URL_PASS
*
PHP_URL_PATH
*
PHP_URL_QUERY
*
PHP_URL_FRAGMENT
Given an URL as scheme://hostname. (i.e. not a FDQN), the parsed [‘host’] array member will contain an invalid hostname (‘hostname.’).