Mb parse str: примеры (PHP)

Работа с функцией mb_parse_str для обработки строк запроса
Раздел: Многобайтовые строки
mb_parse_str(string $string, array &$result = ?): bool
Описание функции mb_parse_str

Функция mb_parse_str разбирает строку, закодированную для передачи данных, и присваивает значения переменным. Это многобайтовая версия функции parse_str, корректно обрабатывающая строки в многобайтовых кодировках, таких как UTF-8.

Назначение

Используется для обработки данных, переданных через строку запроса (например, в URL), когда данные содержат символы, выходящие за пределы ASCII. Функция особенно полезна при работе с многобайтовыми кодировками, где стандартная функция может некорректно интерпретировать символы.

Аргументы
  • string $string - обязательный. Входная строка для разбора.
  • array|null &$result - необязательный. Если аргумент передан, то результат разбора помещается в этот массив, а не создает отдельные переменные. По умолчанию null.

Возвращает true в случае успешного выполнения.

Короткие примеры использования
Базовый пример разбора строки
<?php
$str = 'name=%D0%98%D0%B2%D0%B0%D0%BD&age=30';
mb_parse_str($str, $result);
print_r($result);
?>
Array
(
    [name] => Иван
    [age] => 30
)
Разбор с созданием переменных
<?php
$str = 'city=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&country=%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F';
mb_parse_str($str);
echo $city;
?>
Москва
Работа со сложными именами переменных
<?php
$str = 'user%5Bname%5D=%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B5%D0%B9&user%5Bage%5D=25';
mb_parse_str($str, $output);
print_r($output);
?>
Array
(
    [user] => Array
        (
            [name] => Алексей
            [age] => 25
        )

)
Альтернативные функции в PHP
  • parse_str - стандартная функция для разбора строк. Не поддерживает многобайтовые кодировки корректно. Предпочтительнее использовать mb_parse_str при работе с UTF-8 данными.
  • parse_url - извлекает компоненты URL, включая строку запроса. Может использоваться в сочетании с mb_parse_str.
  • explode - разбивает строку по разделителю. Подходит для простых случаев, но не обрабатывает URL-кодирование.
  • http_build_query - обратная функция, создает строку запроса из массива.
Типичные ошибки
Некорректная кодировка входной строки
<?php
// Строка в неправильной кодировке
$str = 'name=Иван&age=30'; // Не URL-encoded
mb_parse_str($str, $result);
print_r($result);
?>
Array
(
    [name] => Иван
    [age] => 30
)
// Но это сработает только если настройки кодировки совпадают
Перезапись существующих переменных
<?php
$name = 'СтароеИмя';
$str = 'name=НовоеИмя';
mb_parse_str($str); // Перезапишет $name
echo $name;
?>
НовоеИмя
Использование без второго аргумента при ненадежных данных
<?php
// Пользовательские данные могут перезаписать важные переменные
$str = '_SERVER=malicious';
mb_parse_str($str);
// Это опасно!
Изменения в последних версиях PHP

В PHP 8.0 второй параметр $result стал обязательным. Это изменение направлено на повышение безопасности, чтобы избежать неявного создания переменных.

<?php
// PHP 7 и ниже
mb_parse_str('name=John'); // Создает $name

// PHP 8.0+
mb_parse_str('name=John', $result); // Теперь требуется второй аргумент
?>
Расширенные примеры
Обработка нескольких значений для одного параметра
Пример php
<?php
$str = 'color=%D0%BA%D1%80%D0%B0%D1%81%D0%BD%D1%8B%D0%B9&color=%D0%B7%D0%B5%D0%BB%D0%B5%D0%BD%D1%8B%D0%B9';
mb_parse_str($str, $result);
print_r($result);
?>
Array
(
    [color] => зеленый
    // Последнее значение перезаписывает предыдущее
)
Работа с массивами в строке запроса
Пример php
<?php
$str = 'ids%5B0%5D=1&ids%5B1%5D=2&ids%5B2%5D=3';
mb_parse_str($str, $result);
print_r($result);
?>
Array
(
    [ids] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)
Комбинирование с parse_url
Пример php
<?php
$url = 'https://example.com/page?name=%D0%9F%D0%B5%D1%82%D1%80&action=view';
$query = parse_url($url, PHP_URL_QUERY);
mb_parse_str($query, $params);
print_r($params);
?>
Array
(
    [name] => Петр
    [action] => view
)
Специфические символы в значениях
Пример php
<?php
$str = 'text=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%2C%20%D0%BC%D0%B8%D1%80%21';
mb_parse_str($str, $result);
echo $result['text'];
?>
Привет, мир!
Аналоги в других языках

Mb parse str в Javascript

URLSearchParams - объект для работы с параметрами строки запроса.

const params = new URLSearchParams('name=%D0%98%D0%B2%D0%B0%D0%BD&age=30');
console.log(params.get('name'));
Иван

Mb parse str в Python

urllib.parse.parse_qs - функция для разбора строки запроса в словарь.

from urllib.parse import parse_qs
query = 'name=%D0%98%D0%B2%D0%B0%D0%BD&age=30'
parsed = parse_qs(query)
print(parsed['name'][0])
Иван

Mb parse str в MySQL

Прямого аналога нет. Для разбора параметров можно использовать строковые функции, но это не типично.

PHP mb_parse_str function comments

En
Mb parse str Parse GET/POST/COOKIE data and set global variable