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

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

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

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

Код:


<?php
// $add_params - если надо добавить новые параметры в url
function cleverUrlEncode($url, $add_params = []) { $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']) || (!empty($add_params) && is_array($add_params))) { $new_params = []; if (!empty($parse['query'])) { $query_str = str_replace('&amp;', '&', $parse['query']); $expl = explode('&', $query_str); foreach ($expl as $pair) { $pair_expl = explode('=', $pair); if (isset($pair_expl[1])) { $p_name = rawurlencode($pair_expl[0]); $p_value = rawurlencode($pair_expl[1]); $new_params[$p_name] = $p_value; } } } if (!empty($add_params) && is_array($add_params)) { foreach ($add_params as $key => $val) { $key = trim($key); $key = rawurlencode($key); $val = rawurlencode($val); $new_params[$key] = $val; } } if (!empty($new_params)) { $query_str = ''; foreach ($new_params as $key => $val) { if (!empty($query_str)) { $query_str .= '&'; } $query_str .= $key.'='.$val; } if (!empty($query_str)) { $parse['query'] = $query_str; } else { unset($parse['query']); } } else { unset($parse['query']); } } if (!empty($parse['fragment'])) { $parse['fragment'] = rawurlencode($parse['fragment']); } $result = unparse_url($parse); return $result; } function unparse_url($parsed_url) { // https://www.php.net/manual/ru/function.parse-url.php#106731 $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 в комментарии )


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

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