在PHP 5.4之前使用PHP_QUERY_RFC3986进行HTTP构建查询

时间:2012-02-13 17:39:12

标签: php http

我以为我可以使用easy http_build_query来编码来自数组的一些GET参数,但显然enc_type似乎已经在PHP 5.4中添加了。不幸的是我在PHP 5.3.10上。

问题是我需要用%20而不是+的空格编码的参数。在不使用http_build_query的情况下正确编码参数的任何好的快速解决方案?

6 个答案:

答案 0 :(得分:17)

由于在http_build_query返回时对网址进行了编码,因此+始终只是空格,您可以将其与str_replace链接:

$query = str_replace('+', '%20', http_build_query($arr));

如果您不想对~进行编码:

$query = str_replace(
    array('+', '%7E'), 
    array('%20', '~'), 
    http_build_query($arr)
);

答案 1 :(得分:3)

您可以使用de PHP_QUERY_RFC3986标志。

$query = http_build_query($query_data, null, null, PHP_QUERY_RFC3986);

答案 2 :(得分:1)

您还可以通过rawurlencode函数传递查询字符串。在5.3中可用,它编码为RFC 3986:

http://www.php.net/manual/en/function.rawurlencode.php

答案 3 :(得分:1)

@ cwd的答案稍微简洁一点。

public function httpBuildQuery3986(array $params, $sep = '&')
{
    $parts = array();
    foreach ($params as $key => $value) {
        $parts[] = sprintf('%s=%s', $key, rawurlencode($value));
    }

    return implode($sep, $parts);
}

答案 4 :(得分:0)

这是我尝试使用PHP 5.3的函数来构建RFC 3986查询字符串。

// build query strings with RFC 3986 encoding for PHP < 5.4
// does not have $numeric_prefix or $enc_type options
// note per the rawurlencode man page:
// Prior to PHP 5.3.0, rawurlencode encoded tildes (~) as per » RFC 1738.

function http_build_query_rfc_3986($query_data,$arg_separator='&')
{
    $r = '';
    $query_data = (array) $query_data;
    if(!empty($query_data))
    {
        foreach($query_data as $k=>$query_var)
        {
            $r .= $arg_separator;
            $r .= $k;
            $r .= '=';
            $r .= rawurlencode($query_var);
        }
    }
    return trim($r,$arg_separator);

}

答案 5 :(得分:-2)

http_build_query($command, null, '&', PHP_QUERY_RFC3986);