Функция cot_parse_url разделяет URL на части, как стандартная функция parse_url, но с учетом обходных путей для устаревших версий PHP (до 5.4.7), где возникают проблемы с парсингом URL с пропущенной схемой или URL, содержащих данные авторизации.
Код функции:
function cot_parse_url($url)
{
$urlp = parse_url($url); // Разделяем URL на части с помощью стандартной функции parse_url
$needfix = false; // Флаг, указывающий, требуется ли исправление
// Проверяем URL с пропущенной схемой на старых версиях PHP (например, //somesite.com)
if (empty($urlp['scheme']) && isset($urlp['path']) && substr($urlp['path'], 0, 2) == '//') {
$needfix = true;
}
// Проверяем URL с данными авторизации (например, user[:pass]@site.com/)
if (
empty($urlp['host']) &&
isset($urlp['path']) &&
preg_match('#^(([^@:]+)|([^@:]+:[^@:]+?))@.+/#', $urlp['path'])
) {
$needfix = true;
}
// Если требуется исправление
if ($needfix) {
$fake_scheme = 'fix-url-parsing'; // Фиктивная схема для исправления парсинга
$delimiter = (substr($urlp['path'], 0, 2) == '//') ? ':' : '://'; // Выбираем разделитель для схемы
$url = $fake_scheme . $delimiter . $url; // Добавляем фиктивную схему
$urlp = parse_url($url); // Повторно парсим URL
if ($urlp['scheme'] == $fake_scheme) unset($urlp['scheme']); // Убираем фиктивную схему из результата
}
return $urlp; // Возвращаем массив с частями URL
}
Объяснение:
Стандартное поведение:
Функция сначала пытается разделить URL с помощью стандартной функции parse_url.
Если схема (например, http, https) отсутствует или URL содержит данные авторизации, функция пытается исправить поведение.
Проблемы старых версий PHP:
Пропущенная схема: На версиях PHP до 5.4.7 URL вида //somesite.com обрабатывается неправильно, поскольку parse_url ожидает схему.
Данные авторизации: Если URL содержит информацию о пользователе (например, user[:pass]@site.com), старая функция parse_url может не разделить его корректно.
Исправление:
Добавляется фиктивная схема (fix-url-parsing) для корректного парсинга.
Используется разделитель : (для URL с пропущенной схемой) или :// (для других случаев).
После повторного вызова parse_url фиктивная схема удаляется из массива.
Возвращаемый результат:
Функция возвращает массив с частями URL:
[
'scheme' => 'http', // Схема (если присутствует)
'host' => 'example.com', // Хост
'path' => '/page', // Путь
...
]
Пример использования:
Сценарий 1: URL с пропущенной схемой
$url = '//example.com/page';
$result = cot_parse_url($url);
print_r($result);
Результат:
Array
(
[host] => example.com
[path] => /page
)
Сценарий 2: URL с данными авторизации
$url = 'user:[email protected]/page';
$result = cot_parse_url($url);
print_r($result);
Результат:
Array
(
[user] => user
[pass] => password
[host] => example.com
[path] => /page
)
Итог:
Функция cot_parse_url является надстройкой над стандартной parse_url, которая исправляет её недостатки для некоторых специфических случаев. Это особенно полезно в проектах на Cotonti, где могут использоваться URL нестандартного формата.