我正在使用第三方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函数/类方法可以帮助我快速构建这样的查询?
谢谢
答案 0 :(得分:10)
我不知道一种标准的方法(我认为没有这种方式),但这是一个丑陋的解决方案:
由于[]
由http_build_query
编码,您可以生成带索引的字符串,然后替换它们。
preg_replace('/(%5B)\d+(%5D=)/i', '$1$2', http_build_query($params));
答案 1 :(得分:4)
我非常同意RiaD的答案,但你可能会遇到这些代码的一些问题(抱歉,由于缺乏代表,我不能只是将其作为评论)。
首先,据我所知http_build_query返回一个urlencode()'d字符串,这意味着你不会[和]而是你将拥有%5B和%5D。
其次,PHP的PCRE引擎将'['字符识别为字符类的开头而不仅仅是一个简单的'['(PCRE Meta Characters)。这最终可能会使用'[]'替换您请求中的所有数字。
你更可能想要这样的东西:
preg_replace('/\%5B\d+\%5D/', '%5B%5D', http_build_query($params));
在这种情况下,您需要转义%字符,因为它们也具有特殊含义。如果您有一个包含实际括号而不是转义符的字符串,请尝试:
preg_replace('/\[\d+\]/', '[]', $http_query);
答案 2 :(得分:3)
使用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 gist,以便其他人可以使用它!
答案 3 :(得分:1)
试试这个:
$params['text'][] = 'Hello World';
$params['text'][] = 'How are you?';
$params['html'][] = '<p>Just fine, thank you</p>';
foreach ($params as $key => $value) {
foreach ($value as $key2 => $value2) {
$http_query.= $key . "[]=" . $value2 . "&";
}
}
$http_query = substr($http_query, 0, strlen($http_query)-1); // remove the last '&'
$http_query = str_replace(" ", "%20", $http_query); // manually encode spaces
echo $http_query;