Urldecode: примеры (PHP)
urldecode(string string): stringФункция urldecode применяется для декодирования строки, закодированной для передачи в URL. Она преобразует проценты-кодированные последовательности (%XX, где XX - шестнадцатеричное число) обратно в символы, а также заменяет символы плюсов (+) на пробелы.
Использование функции актуально при обработке данных, полученных через методы GET или POST, когда значения параметров URL могут быть закодированы. Это необходимо для правильной интерпретации специальных символов, таких как кириллица, пробелы или знаки препинания.
Функция принимает единственный обязательный аргумент:
- $string (string) - строка, подлежащая декодированию.
В результате возвращается декодированная строка или false в случае возникновения ошибки (например, при передаче нестрокового типа до PHP 8.0).
Декодирование строки с пробелами и специальными символами:
echo urldecode('Hello+World%21');Hello World!
Восстановление русских букв из процентного кодирования:
echo urldecode('%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82');Привет
Пример обработки части адреса:
$param = urldecode('name%3DIvan%26age%3D25');
echo $param;name=Ivan&age=25
- rawurldecode() - Декодирует проценты-кодированные последовательности, но не преобразует плюсы в пробелы. Предпочтительнее при работе с путями, где символ '+' должен сохраняться.
- htmlspecialchars_decode() - Преобразует HTML-сущности обратно в символы. Используется для вывода HTML-безопасного текста в исходном виде.
- parse_str() - Парсит строку запроса (например, name=Ivan&age=25) в массив. Часто применяется совместно с urldecode() для обработки сложных параметров.
Повторный вызов функции для уже декодированной строки может исказить данные:
$str = urldecode('test%2520');
echo $str;
echo ' => ';
echo urldecode($str);test%20 => test
В PHP 8 передача нестрокового значения вызовет TypeError:
try {
urldecode([]);
} catch (TypeError $e) {
echo $e->getMessage();
}urldecode(): Argument #1 ($string) must be of type string, array given
Функция работает только со строками. Для обработки массива требуется итерация:
$arr = ['key1' => 'value%201', 'key2' => 'value%202'];
$decoded = array_map('urldecode', $arr);
print_r($decoded);Array
(
[key1] => value 1
[key2] => value 2
)В PHP 8.0 аргумент функции стал строго типизированным. Передача значения, отличного от строки, теперь вызывает исключение TypeError. В более ранних версиях такие аргументы могли приводиться к строке, что иногда приводило к неявным ошибкам.
Обработка всех входящих GET-параметров:
$_GET = array_map('urldecode', $_GET);
print_r($_GET);Извлечение параметров из строки запроса после декодирования:
$query = 'user%3DJohn%26action%3Dedit%26id%3D10';
parse_str(urldecode($query), $params);
print_r($params);Array
(
[user] => John
[action] => edit
[id] => 10
)Функция urldecode не учитывает кодировку. Для корректной работы с UTF-8 может потребоваться дополнительная проверка:
$str = urldecode('%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82');
if (mb_check_encoding($str, 'UTF-8')) {
echo 'Валидная UTF-8 строка: ' . $str;
}Валидная UTF-8 строка: Привет
Восстановление исходного имени файла из URL:
$filePath = urldecode('/docs/my%20file%20%281%29.txt');
echo $filePath;/docs/my file (1).txt
Демонстрация разницы в обработке символа '+':
$url = 'Hello+World%2BTest';
echo 'urldecode: ' . urldecode($url) . "\n";
echo 'rawurldecode: ' . rawurldecode($url);urldecode: Hello World+Test rawurldecode: Hello+World+Test
Urldecode в Python
Функция unquote() из модуля urllib.parse:
from urllib.parse import unquote
print(unquote('Hello+World%21'))Hello World!
Urldecode в Javascript
Глобальная функция decodeURIComponent():
console.log(decodeURIComponent('Hello%20World%21'));Hello World!
Urldecode в MySQL
Функция DECODE() не предназначена для URL. Обычно декодирование выполняется на уровне приложения, но можно использовать замену:
SELECT REPLACE('Hello+World%21', '%21', '!');Hello+World!