Функция 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 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Article multicategories

Additional categories where this article is shown as similar.

Content author

Administrator

Offline

Administrator

Last logged: 2026-09-13 14:50

  • Page published: 2025-01-23 23:22
  • Last update: 2025-01-23 23:22