【问题标题】:PHP Regex Parse query string containing un-encoded ampersandsPHP Regex Parse 查询字符串包含未编码的 & 符号
【发布时间】:2010-11-03 21:58:12
【问题描述】:

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

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

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

我在寻找什么:

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

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

【问题讨论】:

  • 密钥(姓名、公司等)是否可预测/固定?
  • 密钥是用户生成的且不可预测的:(
  • 那么几乎没有办法......除非你可以说一个“空”值(如果你把它解析为一个有效的查询字符串)100%肯定不会发生(只是循环parse_str 的结果如果当前键的值为空字符串,则将当前键添加到前一个值。
  • 这是一个可怕的错误。如果您必须使用执行此操作的系统,并且开发人员不准备修复它,那么您应该发出很多响亮的抱怨声。不应允许开发人员摆脱这种错误。

标签: php regex parsing query-string ampersand


【解决方案1】:

这个怎么样:

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

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

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

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

【讨论】:

  • 这看起来很棒,但不幸的是,如果该值中包含多个 & 符号,它将无法正常工作(尽管这不太可能)。
  • 它很接近,如果它只能适用于多个 & 符号。
  • Tatu - 我对其进行了调整以在第二个&符号上使用前瞻而不是实际匹配,这应该允许它适用于值中的任意数量的&符号。
  • @Amber,现在似乎可以正常工作了,太好了。那里有一些适当的RE掌握:)
  • 这是一个令人印象深刻的正则表达式解决一个可怕的问题。
【解决方案2】:

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

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

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

print_r($resultarray);

未经测试!但你应该明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2021-09-15
    相关资源
    最近更新 更多