0

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

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

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

我在找什么:

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

我考虑过遍历字符串,一个接一个的&符号,但这似乎很愚蠢。帮助?

4

2 回答 2

3

这个怎么样:

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

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

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

$better_qs = preg_replace("/&(?=[^=]*&)/", "%26", $bad_qs);
于 2010-11-03T22:12:40.293 回答
0

您还可以使用 split() 函数按 & 号分割字符串。之后,您可以使用分隔符 "="... 再次拆分每个元素,如下所示:

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

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

print_r($resultarray);

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

于 2010-11-03T22:07:49.297 回答