Строка 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