12

次のようにエンコードする必要があるいくつかのパラメーターを受け取るサードパーティの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の要点を公開することができます!

于 2012-08-16T23:04:43.327 に答える
1

Try this:

$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 に答える