我以为我可以使用easy http_build_query
来编码来自数组的一些GET参数,但显然enc_type
似乎已经在PHP 5.4中添加了。不幸的是我在PHP 5.3.10上。
问题是我需要用%20
而不是+
的空格编码的参数。在不使用http_build_query
的情况下正确编码参数的任何好的快速解决方案?
答案 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:
答案 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);