PHP Regex Parse包含未编码的&符号的查询字符串

时间:2010-11-03 21:58:12

标签: php regex parsing query-string ampersand

我收到一个查询字符串(来自一个可怕的支付系统,其名称我不想公开),其中包含未编码的&符号

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

parse_str无法处理这个问题,而且我不知道正则表达式是否能够提出我自己的方案(尽管我确实尝试过)。我的挂机是前瞻性的正则表达式,我不太明白。

我在寻找:

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

我想过穿过琴弦,&符号&符号,但这看起来很傻。帮助

2 个答案:

答案 0 :(得分:2)

这个怎么样:

如果两个&符号之间没有=,则编码第一个&符号。然后将结果传递给普通的查询字符串解析器。

那应该完成你的任务。这是有效的,因为“普通”查询字符串的模式应始终等于符号和符号;因此连续两个&符号意味着其中一个应该被编码,只要键中没有符号,行中的最后一个&符号始终是新键之前的“真正”符号。

您应该能够使用以下正则表达式进行编码:

$better_qs = preg_replace("/&(?=[^=]*&)/", "%26", $bad_qs);

答案 1 :(得分:0)

您还可以使用split()函数将字符串拆分为&符号。之后,您可以使用分隔符“=”再次拆分每个元素......类似于:

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

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

print_r($resultarray);

未经测试!但你应该明白这一点。