Разбирает URL-адрес и возвращает компоненты адреса

# parse_url

(PHP 4, PHP 5, PHP 7, PHP 8)

parse_url — Разбирает URL-адрес и возвращает компоненты адреса

### Описание

function parse_url(string `$url`, int `$component` = -1): int|string|array|null|false

Функция разбирает URL-адрес и возвращает ассоциативный массив, который содержит компоненты URL-адреса, которые адрес представляет. Значения элементов массива не URL-декодируются.

Функция не проверяет корректность URL-адреса, а только разбивает адрес на части. Функция parse_url() также принимает неполные и недопустимые URL-адреса и попытается их разобрать.

Предостережение

Функция не следует ни одному из принятых стандартов URI или URL. Она вернёт неправильные или бессмысленные результаты для относительных или некорректных URL-адресов. Даже для корректных URL-адресов результат иногда отличается от результата другого анализатора URL-адресов, поскольку существует несколько разных стандартов, связанных с URL-адресами, которые предназначены для разных сценариев использования и отличаются требованиями.

Обработка URL-адреса анализаторами, которые следуют разным стандартам URL, распространённый источник уязвимостей безопасности. Например, проверка URL-адреса по списку разрешённых имён хостов анализатором A иногда оказывается неэффективной, когда фактическое получение ресурса выполняется анализатором B, который извлекает имена хостов по-другому.

Классы Uri\Rfc3986\Uri и Uri\WhatWg\Url строго следуют стандартам RFC 3986 и WHATWG URL соответственно. Настоятельно рекомендуется использовать эти классы для всего вновь создаваемого кода и переводить существующее применение функции parse_url() на эти классы, если только поведение функции parse_url() не требуется сохранить из соображений совместимости.

### Список параметров

`url`

  URL-адрес, который требуется разобрать.

`component`

  Константы из следующего списка помогают получить только конкретный компонент URL-адреса в виде строки (string): `PHP_URL_SCHEME`, `PHP_URL_HOST`, `PHP_URL_PORT`, `PHP_URL_USER`, `PHP_URL_PASS`, `PHP_URL_PATH`, `PHP_URL_QUERY` или `PHP_URL_FRAGMENT`. Исключение — константа `PHP_URL_PORT`, с которой значение возврата будет принадлежать типу int.

### Возвращаемые значения

При разборе неправильных URL-адресов, в формате которых допустили серьёзные ошибки, функция parse_url() иногда возвращает значение `false`.

Функция вернёт ассоциативный массив (array), если параметр `component` опустили. Массив представит по крайней мере один элемент. Ключи, которые будет содержать массив, если функция обнаружит в URL-адресе компоненты, которые соответствуют названиям ключей:

- scheme — схема наподобие `http`
- host
- port
- user
- pass
- path
- query — часть адреса после знака вопроса `?`, но до символа решетки
- fragment — часть адреса после символа `#` — идентификатора фрагмента или якоря

С параметром `component` функция parse_url() вернёт вместо массива (array) строку (string), или число (int), если указали константу `PHP_URL_PORT`. Функция вернёт значение `null`, если URL-адрес не содержит компонент, который запросили. Начиная с PHP 8.0.0 функция parse_url() различает запросы и фрагменты, которые не содержатся в адресе или оказались пустыми:

    http://example.com/foo → query = null, fragment = null
    http://example.com/foo? → query = "",   fragment = null
    http://example.com/foo# → query = null, fragment = ""
    http://example.com/foo?# → query = "",   fragment = ""

Раньше в каждом случае запрос и фрагмент равнялись `null`.

Обратите внимание, что управляющие символы в компонентах заменяются подчёркиванием — `_`. Подробнее об управляющих символах рассказывает описание функции ctype_cntrl().

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

Версия | Описание
--- | ---
8.0.0 | Функция parse_url() теперь различит запросы и фрагменты, которые не содержатся в адресе или пусты.

### Примеры

Пример #1 Пример разбора URL-адреса функцией parse_url()

    <?php

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

    var_dump(parse_url($url));
    var_dump(parse_url($url, PHP_URL_SCHEME));
    var_dump(parse_url($url, PHP_URL_USER));
    var_dump(parse_url($url, PHP_URL_PASS));
    var_dump(parse_url($url, PHP_URL_HOST));
    var_dump(parse_url($url, PHP_URL_PORT));
    var_dump(parse_url($url, PHP_URL_PATH));
    var_dump(parse_url($url, PHP_URL_QUERY));
    var_dump(parse_url($url, PHP_URL_FRAGMENT));

    ?>

Результат выполнения приведённого примера:

    array(8) {
      ["scheme"]=>
      string(4) "http"
      ["host"]=>
      string(8) "hostname"
      ["port"]=>
      int(9090)
      ["user"]=>
      string(8) "username"
      ["pass"]=>
      string(8) "password"
      ["path"]=>
      string(5) "/path"
      ["query"]=>
      string(9) "arg=value"
      ["fragment"]=>
      string(6) "anchor"
    }
    string(4) "http"
    string(8) "username"
    string(8) "password"
    string(8) "hostname"
    int(9090)
    string(5) "/path"
    string(9) "arg=value"
    string(6) "anchor"

Пример #2 Пример разбора функцией parse_url() URL-адреса без схемы

    <?php

    $url = '//www.example.com/path?googleguy=googley';

    // До 5.4.7 функция показывала элемент path как "//www.example.com/path"
    var_dump(parse_url($url));

    ?>

Результат выполнения приведённого примера:

    array(3) {
      ["host"]=>
      string(15) "www.example.com"
      ["path"]=>
      string(5) "/path"
      ["query"]=>
      string(17) "googleguy=googley"
    }

### Примечания

> Замечание:

> Функцию разработали только для разбора URL-адресов, а не URI-идентификаторов, но чтобы соответствовать требованиям обратной совместимости PHP, функция делает исключение для схемы `file://`, в которой допускаются тройные слеши — `file:///...`. Для любой другой схемы это недопустимо.

### Смотрите также

- pathinfo() - Возвращает информацию о пути к файлу
- parse_str() - Разбирает строку как аргументы URL-адреса
- http_build_query() - Генерирует URL-кодированную строку запроса
- dirname() - Возвращает путь к родительскому каталогу
- basename() - Возвращает конечный компонент имени пути
- » Стандарт RFC 3986

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open