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