Parse str: примеры (PHP)

Использование parse_str для преобразования строк запроса в PHP
Раздел: Работа с переменными
parse_str(string $string, array &$result = ?): void
Функция parse_str

Функция parse_str разбирает строку, как если бы она была строкой запроса URL, и помещает полученные переменные в массив или в текущую область видимости. Основное назначение - парсинг данных, передаваемых через GET-запросы или аналогичных строк формата 'ключ=значение'.

Аргументы функции

Функция имеет два параметра:

  1. $string (обязательный): строка для разбора. Обычно это строка вида 'name=John&age=30&city=NewYork'.
  2. $result (необязательный): если этот аргумент предоставлен, переменные сохраняются в этом массиве, а не в глобальной области видимости. Начиная с PHP 7.2, этот параметр стал обязательным в большинстве контекстов использования для улучшения безопасности.
Базовые примеры использования
Пример 1: Базовый разбор строки
$query = 'name=Alex&age=25&city=Moscow';
parse_str($query, $output);
print_r($output);
Array
(
    [name] => Alex
    [age] => 25
    [city] => Moscow
)
Пример 2: Работа с массивами в строке
$query = 'colors[]=red&colors[]=green&info[name]=John';
parse_str($query, $output);
print_r($output);
Array
(
    [colors] => Array
        (
            [0] => red
            [1] => green
        )
    [info] => Array
        (
            [name] => John
        )
)
Пример 3: Использование без второго параметра (устаревший способ)
$query = 'page=home&action=view';
parse_str($query);
echo $page; // home
echo $action; // view
home
view
Похожие функции в PHP
parse_url

Разбирает URL и возвращает его компоненты (хост, путь, запрос и т.д.). Полезно для извлечения строки запроса из полного URL перед использованием parse_str.

http_build_query

Обратная функция, которая генерирует строку запроса URL из массива или объекта. Часто используется вместе с parse_str.

explode

Разбивает строку по разделителю, но не обрабатывает сложные структуры с вложенными массивами и специальными символами, как это делает parse_str.

Когда что использовать

parse_str предпочтительнее для разбора строк запроса URL со сложной структурой. Для простых пар 'ключ=значение' с простым разделителем может быть достаточно explode. parse_url используется как первый этап для извлечения строки запроса из полного адреса.

Типичные ошибки
Ошибка 1: Использование без второго параметра в новых версиях PHP
// PHP 7.2+
$query = 'page=admin&action=delete';
parse_str($query); // Предупреждение
// Переменные $page и $action не создаются в текущей области видимости
Warning: parse_str(): Calling parse_str() without the result argument is deprecated
Ошибка 2: Некорректные символы в строке
$query = 'name=John Doe&age=30'; // Пробел не закодирован
parse_str($query, $output);
print_r($output);
Array
(
    [name] => John Doe
    [age] => 30
)

Пробелы и специальные символы должны быть правильно закодированы с помощью urlencode().

Ошибка 3: Перезапись существующих переменных
$data = 'important=original';
$important = 'critical value';
parse_str($data); // Устаревший способ
// Переменная $important будет перезаписана

Этого можно избежать, используя второй параметр.

Изменения в версиях PHP
PHP 7.2

Использование parse_str() без второго параметра стало выдавать предупреждение об устаревании (E_DEPRECATED). Это изменение направлено на улучшение безопасности, чтобы избежать непреднамеренного создания переменных в глобальной области видимости.

PHP 8.0

Функция была модифицирована для более строгой обработки ошибок. Улучшена совместимость с современными стандартами разбора URL.

Расширенные примеры
Пример 1: Разбор сложных структур
Пример php
$query = 'user[name]=John&user[contacts][email]=john@example.com&ids[]=1&ids[]=2';
parse_str($query, $result);
print_r($result);
Array
(
    [user] => Array
        (
            [name] => John
            [contacts] => Array
                (
                    [email] => john@example.com
                )
        )
    [ids] => Array
        (
            [0] => 1
            [1] => 2
        )
)
Пример 2: Обработка специальных символов
Пример php
$query = 'title=Hello%20World%21&price=100%24';
parse_str($query, $result);
print_r($result);
Array
(
    [title] => Hello World!
    [price] => 100$
)
Пример 3: Комбинация с parse_url
Пример php
$url = 'https://example.com/page?action=view&id=123&filter[name]=John';
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $params);
print_r($params);
Array
(
    [action] => view
    [id] => 123
    [filter] => Array
        (
            [name] => John
        )
)
Пример 4: Восстановление исходной строки
Пример php
$original = 'name=John&age=30';
parse_str($original, $parsed);
$restored = http_build_query($parsed);
echo $restored;
name=John&age=30
Пример 5: Обработка дублирующихся параметров
Пример php
$query = 'color=red&color=blue&color=green';
parse_str($query, $result);
print_r($result);
Array
(
    [color] => green
)

Последнее значение перезаписывает предыдущие. Для сохранения всех значений используйте синтаксис с квадратными скобками.

Аналоги в других языках
Python (urllib.parse.parse_qs)
from urllib.parse import parse_qs
query = 'name=Alex&age=25'
result = parse_qs(query)
print(result)  # {'name': ['Alex'], 'age': ['25']}
{'name': ['Alex'], 'age': ['25']}

Отличие: по умолчанию возвращает значения в виде списков.

JavaScript (URLSearchParams)
const query = 'name=Alex&age=25';
const params = new URLSearchParams(query);
console.log(params.get('name')); // Alex
console.log(params.get('age'));  // 25
Alex
25

Отличие: объектно-ориентированный интерфейс, не создает многомерные массивы автоматически.

MySQL (нет прямой аналогии)

В MySQL нет встроенной функции для разбора строк запроса. Обычно это делается на уровне приложения или с помощью пользовательских функций.

PHP parse_str function comments

En
Parse str Parses the string into variables