parse_str()
Статья о функции PHP parse_str(), которая разбирает строку запроса на переменные. Полезна при работе с URL и формами.
Функция PHP parse_str() разбирает строку URL-запроса (часть после ? в URL, например name=John&age=35) и превращает каждую пару key=value в элемент массива. Она является обратной к http_build_query(): одна строит строку запроса, другая её разбирает.
На этой странице рассматриваются синтаксис функции, базовый пример, работа с массивами и вложенными ключами, правила URL-декодирования, а также важное замечание по безопасности о втором аргументе.
Синтаксис
parse_str(string $string, array &$result): voidparse_str() принимает два параметра:
$string— строка запроса для разбора, напримерname=John&age=35.&$result— переменная, передаваемая по ссылке, в которую функция записывает разобранные пары ключ/значение. При каждом вызове она перезаписывается новым массивом.
Функция ничего не возвращает (void); разобранные данные записываются в $result.
Примечание: в более старых версиях PHP аргумент $result был необязательным, и его отсутствие импортировало каждую пару непосредственно в локальные переменные. Это поведение было объявлено устаревшим в PHP 7.2 и удалено в PHP 8.0 — теперь $result обязателен. Всегда передавайте его.
Базовый пример
Здесь $query содержит строку запроса. parse_str() разбивает её по символу &, декодирует каждое значение и сохраняет результат в $output. Вывод будет следующим:
Array
(
[name] => John Doe
[age] => 35
[gender] => male
)Обратите внимание: John+Doe превратилось в John Doe. Функция parse_str() применяет то же URL-декодирование, что и urldecode(): + становится пробелом, а escape-последовательности %XX разворачиваются.
Разбор массивов и вложенных ключей
Строки запроса часто используют [] для обозначения массивов — точно так же, как поля HTML-форм с именами colors[] или user[name]. Функция parse_str() понимает эту скобочную нотацию и автоматически строит вложенные массивы:
<?php
$query = 'colors[]=red&colors[]=blue&user[name]=Sam&user[age]=20';
parse_str($query, $output);
print_r($output);
?>Вывод:
Array
(
[colors] => Array
(
[0] => red
[1] => blue
)
[user] => Array
(
[name] => Sam
[age] => 20
)
)Именно такой разбор PHP применяет к $_GET и $_POST, поэтому поле формы с именем user[name] приходит как $_POST['user']['name'].
Получение строки запроса из URL
Распространённый подход — извлечь строку запроса из полного URL с помощью parse_url() и передать её в parse_str():
<?php
$url = 'https://example.com/search?term=php&page=2';
parse_str(parse_url($url, PHP_URL_QUERY), $params);
print_r($params);
?>Вывод:
Array
(
[term] => php
[page] => 2
)Для строки запроса текущего запроса parse_str() обычно не нужна — PHP уже заполнил $_GET. Используйте parse_str(), когда строка запроса поступает из другого источника: сохранённого URL, ответа API или полезной нагрузки вебхука.
Замечание по безопасности
Когда вторым аргументом является результирующий массив (как показано выше), parse_str() безопасна и предсказуема. Опасность существовала только в удалённой форме с одним аргументом, при которой переменные вводились непосредственно в локальную область видимости — ненадёжные данные могли перезаписать существующие переменные (вариант старой проблемы register_globals). Поскольку PHP 8.0 убрал эту форму, в современном коде такая уязвимость исчезла. Тем не менее любое значение, полученное из строки запроса, следует считать ненадёжными пользовательскими данными и проверять перед использованием.
Связанные функции
explode()— разбивает строку по разделителю, когда нужен плоский список, а не разбор парkey=value.implode()— объединяет элементы массива обратно в строку.str_getcsv()— разбирает строки в формате CSV в массивы.- Обработка форм в PHP — как
$_GETи$_POSTиспользуют тот же механизм разбора.