Urldecode: примеры (PHP)

Функция urldecode в PHP: практическое применение и нюансы
Раздел: URL
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');
Привет
Декодирование параметра URL

Пример обработки части адреса:

$param = urldecode('name%3DIvan%26age%3D25');
echo $param;
name=Ivan&age=25
Схожие функции в PHP
  • 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

В PHP 8.0 аргумент функции стал строго типизированным. Передача значения, отличного от строки, теперь вызывает исключение TypeError. В более ранних версиях такие аргументы могли приводиться к строке, что иногда приводило к неявным ошибкам.

Расширенные примеры
Декодирование всего массива $_GET

Обработка всех входящих GET-параметров:

Пример php
$_GET = array_map('urldecode', $_GET);
print_r($_GET);
Совместное использование с parse_str

Извлечение параметров из строки запроса после декодирования:

Пример php
$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 может потребоваться дополнительная проверка:

Пример php
$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:

Пример php
$filePath = urldecode('/docs/my%20file%20%281%29.txt');
echo $filePath;
/docs/my file (1).txt
Сравнение с rawurldecode

Демонстрация разницы в обработке символа '+':

Пример php
$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!

PHP urldecode function comments

En
Urldecode Decodes URL-encoded string