我想在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);
我现在的问题:是否有更好的方法来达到预期效果?
答案 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中完全删除。