wp_parse_url()WP 4.4.0

Разбирает переданный URL на компоненты. Унифицирует работу PHP функции parse_url() (обёртка для неё).

Что именно делает функция:

  • Стандартизирует (унифицирует) работу parse_url() и дает возможность указать:

    • URL без протокола (начинается с //).
    • Относительный URL (начинается с /).

    Правильное определение хоста для ссылки без протокола было исправлено для parse_url() в версии PHP 5.4.7.

  • Подавляет ошибки возвращаемые parse_url(). До PHP 5.3.3 parse_url() создавал ошибку уровня E_WARNING, когда не мог разобрать URL.

C версии 4.7.0. был добавлен параметр $component, чтобы соответствовать PHP функции parse_url().

Работает на основе: _get_component_from_parsed_url_array()
1 раз — 0.000001 сек (скорость света) | 50000 раз — 0.07 сек (скорость света) | PHP 7.2.5, WP 5.0

Хуков нет.

Возвращает

Разное.

Когда не указан компонент:

  • array - массив компонентов URL при успешном разборе.
  • false - при ошибке разбора.

Когда указан компонент:

  • строка/число - значение компонента URL (число вернется для компонента PHP_URL_PORT).
  • null - компонент отсутствует в переданном URL.

Подробнее о возвращаемых данных смотрите в описании parse_url().

Использование

wp_parse_url( $url, $component );
$url(строка) (обязательный)
URL для разбора.
$component(число)

Компонент URL для извлечения. Вместо числа можно использовать одну из предопределенных констант PHP:

PHP_URL_SCHEME
PHP_URL_HOST
PHP_URL_PORT
PHP_URL_USER
PHP_URL_PASS
PHP_URL_PATH
PHP_URL_QUERY
PHP_URL_FRAGMENT

По умолчанию: -1 (возвращает все части массива)

Примеры

0

#1 Демонстрация работы

$url = 'https://example.com/path?arg=value#anchor';

$parts = wp_parse_url( $url );

/*
$parts = Array (
	[scheme]   => https
	[host]     => example.com
	[path]     => /path
	[query]    => arg=value
	[fragment] => anchor
)
*/

echo wp_parse_url( $url, PHP_URL_SCHEME );   // https
echo wp_parse_url( $url, PHP_URL_HOST );     // example.com
echo wp_parse_url( $url, PHP_URL_PATH );     // /path
echo wp_parse_url( $url, PHP_URL_QUERY );    // arg=value
echo wp_parse_url( $url, PHP_URL_FRAGMENT ); // anchor

Пример разбора всех возможных компонентов URL:

$url = 'http://username:password@hostname:9090/path?arg=value#anchor';

$parts = wp_parse_url( $url );
/*
$parts = Array (
	[scheme]   => http
	[host]     => hostname
	[port]     => 9090
	[user]     => username
	[pass]     => password
	[path]     => /path
	[query]    => arg=value
	[fragment] => anchor
)
*/
echo wp_parse_url( $url, PHP_URL_SCHEME );   // http
echo wp_parse_url( $url, PHP_URL_HOST );     // hostname
echo wp_parse_url( $url, PHP_URL_PORT );     // 9090
echo wp_parse_url( $url, PHP_URL_USER );     // username
echo wp_parse_url( $url, PHP_URL_PASS );     // password
echo wp_parse_url( $url, PHP_URL_PATH );     // /path
echo wp_parse_url( $url, PHP_URL_QUERY );    // arg=value
echo wp_parse_url( $url, PHP_URL_FRAGMENT ); // anchor
0

#2 Парсинг URL при отсутствии протокола

$url = '//www.example.com/path?googleguy=googley';
$url_parts = wp_parse_url( $url );

/*
$url_parts = Array (
	[host] => www.example.com
	[path] => /path
	[query] => googleguy=googley
)
*/
0

#3 Парсинг URL при отсутствии домена

$parts = wp_parse_url( '/no-dom?param=1#anchor' );

/*
Array (
	[path] => /no-dom
	[query] => param=1
	[fragment] => anchor
)
*/

Список изменений

С версии 4.4.0 Введена.
С версии 4.7.0 The $component parameter was added for parity with PHP's parse_url().

Код wp_parse_url() WP 6.5.2

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 );
}