среда, 18 августа 2021 г.

PHP. Умная функция наподобие urlencode, без изменения домена и слэшей

В PHP нативно есть функции кодирования строки: urlencode и rawurlencode. Но дело в том, что если им передать url целиком (например, ссылку на изображение), то они закодируют не только ту часть, которую действительно нужно кодировать (к примеру, название файла, содержащее пробелы), но также и остальные символы в url-строке, включая слэши и другие символы, которые могут быть в урл и которые кодировать не надо. Тут код небольшой функции, решающей эту проблемку.

Даже две функции. Но можно и в одну объединить при желании, оставим это желающим на разминку :)

Код:


<?php
function cleverUrlEncode($url) {       $parse = parse_url($url);
    if (!$parse) return $url;
    if (!empty($parse['path']) && $parse['path'] !== '/') {
        $expl = explode('/', $parse['path']);
        $newpaths = [];
        foreach ($expl as $item) {
            $newpaths[] = rawurlencode($item);
        }
        $parse['path'] = implode('/', $newpaths);
    }
    if (!empty($parse['query'])) {
        $parse['query'] = rawurlencode($query);
    }
    if (!empty($parse['fragment'])) {
        $parse['fragment'] = rawurlencode($query);
    }
    $result = unparse_url($parse);
    return $result;
}

function unparse_url($parsed_url)
{
    $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
    $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
    $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
    $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
    $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
    $pass     = ($user || $pass) ? "$pass@" : '';
    $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
    $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
    $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
    return "$scheme$user$pass$host$port$path$query$fragment"; }

$link = cleverUrlEncode($link); // пример использования

?>

Какие будут замечания/пожелания - welcome в комментарии )


Комментариев нет:

Отправить комментарий