W3docs

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): void

parse_str() принимает два параметра:

  • $string — строка запроса для разбора, например name=John&age=35.
  • &$result — переменная, передаваемая по ссылке, в которую функция записывает разобранные пары ключ/значение. При каждом вызове она перезаписывается новым массивом.

Функция ничего не возвращает (void); разобранные данные записываются в $result.

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

Базовый пример

php— editable, runs on the server

Здесь $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 используют тот же механизм разбора.

Практика

Практика
Что делает функция 'parse_str()' в PHP?
Что делает функция 'parse_str()' в PHP?
Was this page helpful?