Http build query обратная функция

Http build query обратная функция

Урлы, так их называют по-простому, могут использоваться повсеместно. Иногда требуется преобразовать строку запроса в массив, чтобы выполнить какие либо манипуляции с параметрами строки. Изобретать колесо не придется, так как в PHP для этих целей есть исправно работающая функция parse_url, которую стоит взять на заметку.

Преобразование URL-строки в массив:

В качестве результата функция возвратит ассоциативный массив со всеми компонентами адреса ссылки. Кроме того функция может принимать дополнительный параметр, который указывает на то, чтобы функция вернула какой-либо один компонент.

В официальной документации PHP можно просмотреть более подробную информацию о работе функции parse_url.

Теперь рассмотрим пример, как можно создать URL-строку запроса из ассоциативного массива. Для этих задач в PHP так же есть готовая функция http_build_query, которой можно воспользоваться в случае необходимости.

Пример создания URL-строки из ассоциативного массива

Результатом работы функции будет следующие строки:

Эти функции уже как-то приходилось использовать на своей практике, и стоит отметить их полезность. Использование документации в значительном роде избавляет нас от лишних манипуляций с данными, что в свою очередь экономит ваше время. Успехов в работе!

http_build_query — Generate URL-encoded query string

Описание

Generates a URL-encoded query string from the associative (or indexed) array provided.

Список параметров

May be an array or object containing properties.

If query_data is an array, it may be a simple one-dimensional structure, or an array of arrays (which in turn may contain other arrays).

If query_data is an object, then only public properties will be incorporated into the result.

If numeric indices are used in the base array and this parameter is provided, it will be prepended to the numeric index for elements in the base array only.

This is meant to allow for legal variable names when the data is decoded by PHP or another CGI application later on.

arg_separator.output is used to separate arguments, unless this parameter is specified, and is then used.

By default, PHP_QUERY_RFC1738.

If enc_type is PHP_QUERY_RFC1738, then encoding is performed per » RFC 1738 and the application/x-www-form-urlencoded media type, which implies that spaces are encoded as plus (+) signs.

If enc_type is PHP_QUERY_RFC3986, then encoding is performed according to » RFC 3986, and spaces will be percent encoded (%20).

Возвращаемые значения

Returns a URL-encoded string.

Список изменений

Версия Описание
5.1.2 The arg_separator parameter was added.
5.1.3 Square brackets are escaped.
5.3.6 The enc_type parameter was added.

Примеры

Пример #1 Simple usage of http_build_query()

= array( ‘foo’ => ‘bar’ ,
‘baz’ => ‘boom’ ,
‘cow’ => ‘milk’ ,
‘php’ => ‘hypertext processor’ );

echo http_build_query ( $data ) . "
" ;
echo http_build_query ( $data , » , ‘&’ );

Результат выполнения данного примера:

Пример #2 http_build_query() with numerically index elements.

= array( ‘foo’ , ‘bar’ , ‘baz’ , ‘boom’ , ‘cow’ => ‘milk’ , ‘php’ => ‘hypertext processor’ );

echo http_build_query ( $data ) . "
" ;
echo http_build_query ( $data , ‘myvar_’ );
?>

Результат выполнения данного примера:

Пример #3 http_build_query() with complex arrays

= array( ‘user’ =>array( ‘name’ => ‘Bob Smith’ ,
‘age’ => 47 ,
‘sex’ => ‘M’ ,
‘dob’ => ‘5/12/1956’ ),
‘pastimes’ =>array( ‘golf’ , ‘opera’ , ‘poker’ , ‘rap’ ),
‘children’ =>array( ‘bobby’ =>array( ‘age’ => 12 ,
‘sex’ => ‘M’ ),
‘sally’ =>array( ‘age’ => 8 ,
‘sex’ => ‘F’ )),
‘CEO’ );

Читайте также:  Какой цвет не напрягает глаза

echo http_build_query ( $data , ‘flags_’ );
?>

this will output : (word wrapped for readability)

Only the numerically indexed element in the base array "CEO" received a prefix. The other numeric indices, found under pastimes, do not require a string prefix to be legal variable names.

Пример #4 Using http_build_query() with an object

class parentClass <
public $pub = ‘publicParent’ ;
protected $prot = ‘protectedParent’ ;
private $priv = ‘privateParent’ ;
public $pub_bar = Null ;
protected $prot_bar = Null ;
private $priv_bar = Null ;

public function __construct () <
$this -> pub_bar = new childClass ();
$this -> prot_bar = new childClass ();
$this -> priv_bar = new childClass ();
>
>

class childClass <
public $pub = ‘publicChild’ ;
protected $prot = ‘protectedChild’ ;
private $priv = ‘privateChild’ ;
>

$parent = new parentClass ();

echo http_build_query ( $parent );
?>

Результат выполнения данного примера:

Смотрите также

  • parse_str() — Разбирает строку в переменные
  • parse_url() — Parse a URL and return its components
  • urlencode() — URL-encodes string
  • array_walk() — Применяет пользовательскую функцию к каждому элементу массива

Почему при построении строки запроса с http_build_query функции http_build_query она ссылается на квадратные скобки [] вне значений и как избавиться от нее?

Функция правильно urlencoded a [ в encodedBracket[ в первой строке вывода, но в чем причина кодирования квадратных скобок в var[foo]= и var[bar]= ? Как вы можете видеть, urldecoding строки также декодировал зарезервированные символы в значениях, encodedBracket%5B должен был оставаться таким, как если бы строка запроса была правильной и не стала encodedBracket[ .

Согласно разделу 2.2 Зарезервированные символы унифицированного идентификатора ресурса (URI): общий синтаксис

URI включают компоненты и подкомпоненты, которые ограничены символами в «зарезервированном» наборе. Эти символы называются «зарезервированными», потому что они могут (или не могут) быть определены как разделители общим синтаксисом, каждым синтаксисом конкретной схемы или специфичным для реализации синтаксисом алгоритма разыменования URI. Если данные для компонента URI будут конфликтовать с целью зарезервированного символа в качестве разделителя, тогда конфликтующие данные должны быть закодированы до кодирования URI.

reserved = gen-delims / sub-delims

Так не должно ли http_build_query создавать более читаемый вывод с такими символами, как [] urlencoded только там, где это необходимо? Как я могу сделать такой вывод?

Здесь я нашел следующее «исправление»:

[…] работоспособное «исправление», которое я использовал, – это выполнить postprocess http_build_query () вывод со следующим: «решение», из-за которого моя скин сканирует немного:

Так что теперь это станет:

У вас здесь много вопросов. Выступая в RFC-условиях, вы должны прочитать свои собственные вопросы на этих же условиях. Я беру ваши вопросы сверху вниз:

Как я могу сделать такой вывод?

Используя другой кодировщик, Net_URL2 ( груша / упаковщик ), например:

Так не должно ли http_build_query really создавать более читаемый вывод с такими символами, как [] urlencoded только там, где это необходимо?

Нет, не должно. Даже не требуется кодировать квадратные скобки внутри части запроса, рекомендуется. То, что рекомендуется, должно быть сделано.

Читайте также:  Прошивки для mag 250 бесплатные

Кроме того, http_build_query() не http_build_query() созданием «более читаемого вывода» . Речь идет только о создании запроса URI HTTP. Для такой части запроса квадратные скобки должны быть закодированы в процентах. Это зарезервированные символы, которые специально не разрешены для запроса.

В чем причина кодирования квадратных скобок в var[foo]= и var[bar]= ?

Причиной для кодирования квадратных скобок является та же самая причина для кодирования квадратных скобок в encodedBracket[ . Дифференциация, которую вы делаете между этими частями в своем вопросе, является чисто синтаксической по своему усмотрению, в URI эти части рассматриваются равными. В URI нет частей части запроса. Поэтому различие между скобкой var[ или скобкой encodedBracket[ абсолютно не связано с кодировкой URI части запроса).

Как вы говорите, процентное кодирование encodedBracket[ в encodedBracket%5B является правильным и, поскольку оно принадлежит к той же части URI (часть запроса), логика требует, чтобы вы приняли эту кодировку скобки в var[ to var%5B одинаково корректно с точки зрения кодирования URI. Такая же часть URI, такое же кодирование. Единственным конечным разделителем, который имеет часть запроса, является « # ».

Кроме того, ваши рассуждения показывают недоразумение в этой части:

Как вы можете видеть, urldecoding строки также декодировал зарезервированные символы в значениях, encodedBracket%5B должен был оставаться таким, как если бы строка запроса была правильной и не стала encodedBracket[ .

Если вы urldecode, все процентные кодированные последовательности будут декодированы – независимо от того, представляет ли процентная кодировка зарезервированный символ или нет. С точки зрения правильности, это противоположно тому, что вы заявили: %5B должен быть декодирован до [ независимо от того, был ли он в начале, в середине или в конце строки.

Почему при построении строки запроса с http_build_query функции http_build_query она ссылается на квадратные скобки [] вне значений и как избавиться от нее?

Легче ответить на вторую часть, см. В начале ответа, это уже ответили.

О том, почему это, возможно, может быть не сразу видно, особенно, поскольку вы, возможно, обнаружили, что сам PHP принимает процентные и стенографические квадратные скобки в запросе (даже смешанные) без каких-либо проблем.

Почему возникают различия и почему это так? Действительно ли это так просто, как вы изложите это в своем вопросе? Это только косметическая разница?

Прежде всего, не кодирование квадратных скобок в части запроса запроса URI нарушает RFC3986 в том смысле, что часть запроса не должна содержать скобки из символов gen-delims, не кодированных. Квадратные скобки без процентного кодирования не могут быть частью запроса в соответствии с ABNF:

Избавиться от них поэтому не предлагается (по крайней мере, для целей кодирования в соответствии со стандартом), поскольку это изменит URI:

URI, которые отличаются заменой зарезервированного символа его соответствующим процентным октетом, не эквивалентны.

Это уже хороший намек на то, что для URI, который вы запрашиваете, он имеет другое значение, чем URI PHP создает через встроенную функцию.

Приложения, создающие URI, должны иметь октеты данных с процентным кодированием, которые соответствуют символам зарезервированного набора, если только эти символы не разрешены схемой URI для представления данных в этом компоненте.

Это не относится ко всем символам в gen-delims, но для ABNF:

Читайте также:  Материнка не издает звуков

Поэтому он выглядит так, что http_build_query() отправил маршрут в квадратные скобки с процентом-кодированием, поскольку они зарезервированы и не разрешены с помощью схемы URI для этой части (запроса). В принципе, ничего плохого в этом нет, это следует за рекомендацией RFC3986. И это не говорит о другом значении для тех частей запроса.

Однако вы четко говорите, что технически эти скобки не являются разделителями в запросе. И да, это правда:

Компонент запроса обозначается символом первого символа вопроса («?») И заканчивается символом номера («#») или к концу URI.

Таким образом, по сравнению с тем, что было идентифицировано ранее, поскольку зарезервированные символы специально не разрешены:

(уже довольно маленький список) должно быть ясно, что « # » должно оставаться в резервном порядке, иначе URI будет разорван (истинный разделительный разделитель в конце запроса), но квадратные скобки не должны быть специально разрешены при представлении неравного URI без потери данных и сохранения всех разделителей URI:

Если зарезервированный символ найден в компоненте URI, и для этого символа не определена роль разграничения, тогда его следует интерпретировать как представляющий октет данных, соответствующий кодировке этого символа в US-ASCII.

Поэтому, если вы все еще можете следовать за мной, возможно, вам захочется фактически сделать то, что вы просите: Создание URI, в котором квадратные скобки означают как разделитель (например, представляющий часть определения массива), но не имеющие этого в качестве данных. Хотя данные символа сохраняются на RFC 3986.

Поэтому технически возможно создать URI с квадратными скобками, а не процентами, закодированными в запросе. Технически даже внутри значений, например, это будет синтаксическая разница вне значений, это лишь другое синтаксическое различие внутри значений.

Это также является причиной того, что браузеры сохраняют состояние квадратных скобок в запросе, когда вы вводите их в свой браузер. Процент закодирован или нет – браузер передает эту часть URI как есть на сервер, так что базовые процессы на сервере могут извлечь выгоду из синтаксических различий, которые могли быть выражены этим.

Поэтому правильно выберите кодировку URL-адресов для базовой платформы. Только потому, что это возможно, это не значит, что он работает стабильно. Способ, которым работает http_build_query() , является наиболее стабильным (безопасным) способом после RFC 3986. Однако это необходимо в RFC, поэтому, если вы это понимаете, у вас могут быть веские причины не кодировать квадратные скобки в процентах.

Одна из причин, которую вы называете в своем вопросе, – читаемость. Это особенно важно при написании URL-адресов, например, на листе бумаги. Я не уверен, что квадратная скобка является таким хорошо различимым символом, и если процентное кодирование даже не помогает с удобочитаемостью. Но я не пробовал. PHP будет принимать оба способа. Но тогда вам не нужно будет делать это программно. Поэтому, возможно, читаемость не была в вашем случае.

Ссылка на основную публикацию
Boya by m1 как подключить к компьютеру
Схемы переходников для компьютерных и мобильных гарнитур и микрофонов. Микрофон, наушники и гарнитура У звуковой карты компьютера предусмотрены раздельные гнёзда:...
Adblock detector