(PHP 4, PHP 5, PHP 7, PHP 8)
parse_url — Разбирает URL-адрес и возвращает компоненты адреса
Функция разбирает URL-адрес и возвращает ассоциативный массив, который содержит компоненты URL-адреса, которые адрес представляет. Значения элементов массива не URL-декодируются.
Функция не проверяет корректность URL-адреса, а только разбивает адрес на части. Функция parse_url() также принимает неполные и недопустимые URL-адреса и попытается их разобрать.
Функция иногда даёт неправильные результаты для относительных или недействительных URL-адресов,
и результаты иногда даже не соответствуют стандартному поведению HTTP-клиентов.
При разборе URL-адресов из ненадежных входных данных требуется дополнительная проверка
наподобие той, которая проводится функцией
filter_var() с фильтром FILTER_VALIDATE_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-адресе компоненты,
которые соответствуют названиям ключей:
http
?
,
но до символа решетки
#
—
идентификатора фрагмента или якоря
С параметром 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:///...
. Для любой другой схемы это недопустимо.