我正在使用第三方API,它接收几个参数,这些参数必须像这样编码:
text[]=Hello%20World&text[]=How%20are%20you?&html[]=<p>Just%20fine,%20thank%20you</p>
如您所见,此API可以接受文本的多个参数,也可以接受HTML的多个参数(不在示例调用中)。
我已经使用http_build_query为其他API正确构建了查询字符串
$params['text'][] = 'Hello World';
$params['text'][] = 'How are you?';
$params['html'][] = '<p>Just fine, thank you</p>';
$http_query = http_build_query($params);
这种方法的问题是,它将使用数字索引构建查询字符串:
text[0]=Hello%20World&text[1]=How%20are%20you?&html[0]=<p>Just%20fine,%20thank%20you</p>
不幸的是,我正在使用的API不喜欢数字索引,因此失败了。
有没有什么php函数/class-method可以帮助我快速构建这样的查询?
谢谢
发布于 2012-08-17 07:04:43
似乎没有一种方法可以用http_build_query
做到这一点。抱歉的。不过,在文档页面上,有人有这样的信息:
function cr_post($a,$b=0,$c=0){
if (!is_array($a)) return false;
foreach ((array)$a as $k=>$v){
if ($c) $k=$b."[]"; elseif (is_int($k)) $k=$b.$k;
if (is_array($v)||is_object($v)) {
$r[]=cr_post($v,$k,1);continue;
}
$r[]=urlencode($k)."=" .urlencode($v);
}
return implode("&",$r);
}
$params['text'][] = 'Hello World';
$params['text'][] = 'How are you?';
$params['html'][] = '<p>Just fine, thank you</p>';
$str = cr_post($params);
echo $str;
我还没有测试过。如果它不起作用,那么你将不得不使用你自己的。也许你可以发布一个github要点,这样其他人就可以使用它了!
发布于 2012-08-17 07:06:51
我不知道一个标准的方法(我认为没有这样的方法),但这里有一个丑陋的解决方案:
因为[]
是由http_build_query
编码的,所以您可以生成带有索引的字符串,然后替换它们。
preg_replace('/(%5B)\d+(%5D=)/i', '$1$2', http_build_query($params));
发布于 2012-08-31 06:13:59
我非常同意RiaD的回答,但你可能会在这段代码中遇到一些问题(对不起,由于缺乏代表,我不能只做一个评论)。
首先,据我所知,http_build_query会返回一个urlencode()'d字符串,这意味着你不会有and,而是有%5B和%5D。
其次,PCRE引擎将'[‘字符识别为字符类的开头,而不仅仅是一个简单的'[’(PCRE Meta Characters)。这可能会最终将您请求中的所有数字替换为'[]‘。
你可能更想要这样的东西:
preg_replace('/\%5B\d+\%5D/', '%5B%5D', http_build_query($params));
在这种情况下,您需要对%字符进行转义,因为它们也有特殊的含义。如果您有一个带有实际括号而不是转义的字符串,请尝试如下所示:
preg_replace('/\[\d+\]/', '[]', $http_query);
https://stackoverflow.com/questions/11996573
复制相似问题