12

我正在使用第三方 API,该 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 函数/类方法可以帮助我快速构建这样的查询?

谢谢

4

4 回答 4

11

我不知道这样做的标准方法(我认为没有这种方法),但这是一个丑陋的解决方案:

由于[]由 编码http_build_query,您可以生成带有索引的字符串,然后替换它们。

preg_replace('/(%5B)\d+(%5D=)/i', '$1$2', http_build_query($params));
于 2012-08-16T23:06:50.703 回答
5

我非常同意 RiaD 的回答,但是您可能会在使用此代码时遇到一些问题(抱歉,由于缺乏代表,我不能只发表评论)。

首先,据我所知,http_build_query返回一个 urlencode() 的字符串,这意味着您不会有 [ 和 ],而是会有 %5B 和 %5D。

其次,PHP 的 PCRE 引擎将“[”字符识别为字符类的开头,而不仅仅是简单的“[”(PCRE 元字符)。这最终可能会用“[]”替换您请求中的所有数字。

你更有可能想要这样的东西:

preg_replace('/\%5B\d+\%5D/', '%5B%5D', http_build_query($params));

在这种情况下,您需要转义 % 字符,因为它们也具有特殊含义。如果您有一个带有实际括号而不是转义符的字符串,请尝试以下操作:

preg_replace('/\[\d+\]/', '[]', $http_query);
于 2012-08-30T22:13:59.183 回答
4

似乎没有办法做到这一点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,以便其他人可以使用它!

于 2012-08-16T23:04:43.327 回答
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;
于 2012-08-16T23:11:15.013 回答