Строка запроса PHP Regex Parse, содержащая некодированные амперсанды - PullRequest
0 голосов
/ 04 ноября 2010

Я получаю строку запроса (из ужасной платежной системы, имя которой я не хочу публично подавать), которая содержит незашифрованные амперсанды

name=joe+jones&company=abercrombie&fitch&other=no

parse_str не может обработать это, и яне знаю достаточно регулярных выражений, чтобы придумать свою собственную схему (хотя я пытался).Мое зависание было регулярным выражением, которое я не совсем понял.

Что я искал:

Array
(
    [name] => joe jones
    [company] => abercrombie&fitch
    [other] => no
)

Я думал о том, чтобы пропустить через строку, амперсанд и амперсанд, ноэто просто казалось глупым.Помощь

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010

Как насчет этого:

Если встречаются два амперсанда без =, закодируйте первый.Затем передайте результат обычному анализатору строки запроса.

Это должно выполнить вашу задачу.Это работает, потому что шаблон для «нормальной» строки запроса всегда должен чередовать знаки равенства и амперсанды;таким образом, два амперсанда подряд означают, что один из них должен быть закодирован, и, пока в ключах нет амперсандов, последний амперсанд в строке всегда является «настоящим» амперсандом, предшествующим новому ключу.1007 * Вы должны использовать следующее регулярное выражение для кодирования:

$better_qs = preg_replace("/&(?=[^=]*&)/", "%26", $bad_qs);
0 голосов
/ 04 ноября 2010

Вы также можете использовать функцию split () для разделения строки по амперсандам. После этого вы можете снова разделить каждый элемент с помощью разделителя "=" ... что-то вроде этого:

$myarray = split("&", $mystring);

foreach ($myarray as $element) {
  $keyvalue = split("=", $element);
  $resultarray[$keyvalue[0]] = $keyvalue[1];
}

print_r($resultarray);

Не проверено! Но вы должны понять.

...