В 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('&', '&', $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 в комментарии )
Комментариев нет:
Отправить комментарий