PHP http_build_query特殊符号

时间:2012-06-10 10:03:37

标签: php string curl

我想在http_build_query(PHP)的帮助下用数组创建一个url。这是数组:

$a = array("skip" => 1, "limit" => 1, "startkey" => '["naturalProduct","Apple"]')

致电后

$s = http_build_query($a);

我得到以下字符串$ s:

skip=1&limit=1&startkey=%5B%22naturalProduct%22%2C%22Apple%22%5D

我的问题是,我需要一个这样的网址:

skip=1&limit=1&startkey=["naturalProduct","Apple"]

这意味着,我不想转换以下符号:“,[]

我编写了一个转换函数,我在http_build_query之后调用它:

str_replace(array("%5B", "%22", "%5D", "%2C"), array('[', '"', ']', ','), $uri);

我现在的问题:是否有更好的方法来达到预期效果?

2 个答案:

答案 0 :(得分:5)

  

我现在的问题:是否有更好的方法来达到预期效果?

是的,有更好的东西。默认情况下,http_build_query­Docs使用RFC 1738中概述的URL编码。您只想对字符串进行去编码。为此,有一个函数可以在您的情况下执行此操作:urldecode­Docs

$s = http_build_query($a);
echo urldecode($s);

我希望您知道在完成此操作后,您的网址不再是有效的网址。你已经解码了它。

答案 1 :(得分:1)

您不需要解码特殊字符 - 当生成PHP的$_GET超全局时,它们会自动解码。当我用你生成的字符串print_r($_GET)时,我得到了这个:

  

数组([skip] => 1 [limit] => 1 [startkey] => [\“naturalProduct \”,\“Apple \”])

已解码每个字符,但未使用双引号。要取消它们,请使用stripslashes()

echo stripslashes($_GET['startkey']);

这给出了

  

[ “naturalProduct”, “苹果”]

然后您可以根据自己的意愿解析或使用。正如ThiefMaster在评论中提到的更好的解决方案是在magic_quotes_gpc中禁用php.ini;它被弃用并计划在PHP6中完全删除。