Функция cot_parse_url в Cotonti

разделяет URL на части, как стандартная функция parse_url, но с учетом обходных путей для устаревших версий PHP (до 5.4.7), где возникают проблемы с парсингом URL с пропущенной схемой или URL, содержащих данные авторизации.

Функция 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 нестандартного формата.

2 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 23.01.2025 23:22
  • Последнее обновление: 23.01.2025 23:22