Строка URL в PHP: полный разбор и сборка

Раздел: Веб-разработка на PHP -> Работа с URL в PHP

Работа со строкой URL в PHP

Основной подход: использование встроенных функций

Наиболее эффективный способ работы с URL в PHP - комбинация функций parse_url(), parse_str() и http_build_query(). parse_url() разбивает URL на компоненты (схема, хост, порт, путь, запрос, фрагмент). parse_str() преобразует строку запроса в ассоциативный массив. http_build_query() собирает строку запроса из массива параметров.

Пример:


$url = 'https://example.com/path/to/page?name=Иван&age=25#section';
$parts = parse_url($url);
print_r($parts);

Php создание ссылки (создание ссылки в php)

Array
(
    [scheme] => https
    [host] => example.com
    [path] => /path/to/page
    [query] => name=Иван&age=25
    [fragment] => section
)

Php текущая url (текущая url в php)

Извлечение параметров запроса:


parse_str($parts['query'], $params);
print_r($params);

Mobile php url (мобильный url в php)

Array
(
    [name] => Иван
    [age] => 25
)

Php open url (открытие url в php)

Сборка URL обратно:


$params['age'] = 26;
$newQuery = http_build_query($params);
$newUrl = $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '?' . $newQuery . '#' . $parts['fragment'];
echo $newUrl;

Js php url (javascript и php url)

https://example.com/path/to/page?name=%D0%98%D0%B2%D0%B0%D0%BD&age=26#section

Php строка url (строка url в php)

Проблемы и решения

Проблема: Кодировка кириллицы в URL. Функция http_build_query() автоматически кодирует значения, но декодировать параметры после parse_str() нужно вручную.

Решение: Использовать urldecode() или rawurldecode() для отдельных значений, либо применить mb_convert_encoding() при необходимости.

Как получить отдельные компоненты URL?

Функция parse_url($url, $component) с опциональным вторым параметром возвращает только нужную часть. Например, parse_url($url, PHP_URL_HOST) вернёт домен.


$host = parse_url('http://example.com/path', PHP_URL_HOST);
echo $host; // example.com

Url class php (класс url в php)

Ошибка: Если URL содержит порт, parse_url() может вернуть его отдельно, что иногда путает разработчиков.

Как преобразовать строку запроса в массив?

Используется parse_str($queryString, $result). Важно помнить, что эта функция может перезаписывать существующие переменные, поэтому всегда передавать второй параметр.


$query = 'key1=value1&key2=value2';
parse_str($query, $output);
print_r($output);

Php url query (url-запрос (query string) в php)

Проблема: Параметры с одинаковыми именами преобразуются в массив, что может быть неожиданно. Например, a=1&a=2 даст [a => ['1','2']].

Как собрать URL из компонентов?

Можно собрать вручную, как показано в основном решении, или использовать http_build_url() из PECL-расширения (не всегда доступно). Для переносимого кода лучше ручная сборка.


$scheme = 'https';
$host = 'site.com';
$path = '/api';
$query = http_build_query(['action' => 'get']);
$url = $scheme . '://' . $host . $path . '?' . $query;

Include php url (включение url через include в php)

Ошибка: Забывают добавить разделитель ? или #, что ломает URL.

Как изменить параметр в URL?

Алгоритм: разобрать URL, извлечь query, преобразовать в массив, изменить нужный ключ, собрать обратно.


function changeUrlParam($url, $key, $value) {
    $parts = parse_url($url);
    parse_str($parts['query'] ?? '', $params);
    $params[$key] = $value;
    $parts['query'] = http_build_query($params);
    return $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '?' . $parts['query'] . (isset($parts['fragment']) ? '#' . $parts['fragment'] : '');
}
echo changeUrlParam('http://example.com?name=John', 'name', 'Jane');

Engine php url (движок url в php)

http://example.com?name=Jane

Url form php (url формы в php)

Проблема: Фрагмент после # может быть потерян, если его не учесть при сборке.

Как закодировать или декодировать URL?

urlencode() и urldecode() для кодирования строки запроса (используют + для пробелов). rawurlencode() и rawurldecode() для RFC 3986 (используют %20).


echo urlencode('тест строка'); // %D1%82%D0%B5%D1%81%D1%82+%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0
echo rawurlencode('тест строка'); // %D1%82%D0%B5%D1%81%D1%82%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0

Php base url (базовый url в php)

Ошибка: Использование urlencode() для кодирования всего URL (включая слэши) приводит к некорректному результату. Кодировать нужно только значения параметров.

Как проверить, является ли строка валидным URL?

Фильтр filter_var($url, FILTER_VALIDATE_URL) возвращает false для некорректных URL. Не проверяет реальное существование ресурса.


var_dump(filter_var('http://valid.com', FILTER_VALIDATE_URL)); // string(17) "http://valid.com"
var_dump(filter_var('not a url', FILTER_VALIDATE_URL)); // bool(false)

Catalogue php url (каталог url в php)

Проблема: Фильтр пропускает URL с нестандартными схемами, например, ftp://, но отклоняет http:// без точки в домене (например, http://localhost пропускается, а http://example - нет).

Как получить текущий URL на сервере?

Суперглобальный массив $_SERVER содержит REQUEST_URI (путь и query) и HTTP_HOST для домена. Сборка полного URL:


$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$currentUrl = $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

Php параметр url (параметры url в php)

Ошибка: На некоторых серверах $_SERVER['HTTPS'] не определён. Проверка через $_SERVER['REQUEST_SCHEME'] надёжнее, но не везде доступна.

Как извлечь доменное имя без поддомена?

Использовать parse_url() и затем разбить хост по точкам. Для надёжного выделения домена второго уровня рекомендуется библиотека или сложная логика с публичными суффиксами.


$host = parse_url('https://sub.example.co.uk', PHP_URL_HOST);
$parts = explode('.', $host);
// Примерный подход: взять последние два элемента
$domain = $parts[count($parts)-2] . '.' . $parts[count($parts)-1];
echo $domain; // co.uk (но это неверно для .co.uk)

Проблема: Простое выделение последних двух частей не учитывает составные TLD (например, .co.uk, .com.au). Требуется список публичных суффиксов.

Как работать с относительными URL?

Относительные URL (начинающиеся с /, ./, ../) не имеют схемы и хоста. Для их обработки нужно знать базовый URL. Можно использовать функцию rtrim($base, '/') . '/' . ltrim($relative, '/') но это не решает переходы по уровням. Рекомендуется использовать встроенную функцию joinPath() или сторонние библиотеки.

Ошибка: Простое склеивание строк не работает для ../. Например, из /dir/page и ../other должно получиться /other, но строка даст /dir/../other, что корректно, но не нормализовано.

Пример

// Расширенный пример: функция для безопасного добавления параметра в URL
function addUrlParam($url, $param, $value) {
    $parts = parse_url($url);
    parse_str($parts['query'] ?? '', $params);
    $params[$param] = $value;
    $parts['query'] = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
    $scheme = $parts['scheme'] ?? 'http';
    $host = $parts['host'] ?? '';
    $port = isset($parts['port']) ? ':' . $parts['port'] : '';
    $path = $parts['path'] ?? '/';
    $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : '';
    return $scheme . '://' . $host . $port . $path . '?' . $parts['query'] . $fragment;
}

$url = 'https://api.example.com/v1/users?page=2';
echo addUrlParam($url, 'filter', 'active');
// Результат: https://api.example.com/v1/users?page=2&filter=active
https://api.example.com/v1/users?page=2&filter=active
Пример

// Пример: получение всех параметров URL в виде ассоциативного массива с декодированием
$url = 'http://site.com/?search=%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0&page=1';
$parts = parse_url($url);
parse_str($parts['query'], $params);
$decodedParams = array_map('urldecode', $params);
print_r($decodedParams);
Array
(
    [search] => книга
    [page] => 1
)
Пример

// Пример: замена протокола в URL
$url = 'http://example.com';
$parts = parse_url($url);
$parts['scheme'] = 'https';
$newUrl = (isset($parts['scheme']) ? $parts['scheme'] : 'http') . '://' . $parts['host'] . $parts['path'] . (isset($parts['query']) ? '?' . $parts['query'] : '');
echo $newUrl;
https://example.com
Пример

// Пример: работа с URL, содержащим порт и аутентификацию
$url = 'ftp://user:pass@ftp.example.com:21/path/file.txt';
$info = parse_url($url);
echo 'User: ' . $info['user'] . "\n";
echo 'Pass: ' . $info['pass'] . "\n";
echo 'Port: ' . $info['port'] . "\n";
User: user
Pass: pass
Port: 21
Пример

// Пример: нормализация URL (удаление лишних слешей)
function normalizeUrl($url) {
    $parts = parse_url($url);
    $path = preg_replace('#/+#', '/', $parts['path']);
    $parts['path'] = rtrim($path, '/');
    return $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . (isset($parts['query']) ? '?' . $parts['query'] : '');
}
echo normalizeUrl('http://example.com///foo//bar//');
http://example.com/foo/bar
Пример

// Пример: извлечение пути без query-строки и фрагмента
$url = 'https://shop.com/category/item?id=10#reviews';
$path = parse_url($url, PHP_URL_PATH);
echo $path;
/category/item
Пример

// Пример: удаление всех параметров, кроме указанных
$url = 'http://site.com?keep=1&remove=2&keep2=3';
$parts = parse_url($url);
parse_str($parts['query'], $params);
$allowed = ['keep', 'keep2'];
$params = array_intersect_key($params, array_flip($allowed));
$parts['query'] = http_build_query($params);
$newUrl = $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '?' . $parts['query'];
echo $newUrl;
http://site.com?keep=1&keep2=3

Строка URL в PHP - comments

En
Php строка url (php)