- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
array("fo-6ren">
为什么在使用 http_build_query
函数构建查询字符串时,它会将方括号 []
urlencode 到值之外,如何摆脱它?
$query = array("var" => array("foo" => "value", "bar" => "encodedBracket["));
$queryString = http_build_query($query, "", "&");
var_dump($queryString);
var_dump("urldecoded: " . urldecode($queryString));
输出:
var%5Bfoo%5D=value&var%5Bbar%5D=encodedBracket%5B
urldecoded: var[foo]=value&var[bar]=encodedBracket[
该函数在输出第一行的 encodedBracket[
中正确地对 [
进行了 urlencode,但是在 var[foo] 中对方括号进行编码的原因是什么=
和 var[bar]=
?如您所见,对字符串进行 urldecoding 还对值中的保留字符进行解码,encodedBracket%5B
应该保持原样以使查询字符串正确,而不是变成 encodedBracket[
。
根据 section 2.2 Reserved Characters of Uniform Resource Identifier (URI): Generic Syntax
URIs include components and subcomponents that are delimited by characters in the "reserved" set. These characters are called "reserved" because they may (or may not) be defined as delimiters by the generic syntax, by each scheme-specific syntax, or by the implementation-specific syntax of a URI's dereferencing algorithm. If data for a URI component would conflict with a reserved character's purpose as a delimiter, then the conflicting data must be percent-encoded before the URI is formed.
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
那么 http_build_query
真的不应该产生更具可读性的输出吗?像 []
这样的字符只在需要的地方进行 urlencode 编码?我如何让它产生这样的输出?
最佳答案
这是我编写的一个快速函数,用于生成更好的查询字符串。它不仅不对方括号进行编码,而且如果与索引匹配,还会省略数组键。请注意,它不支持对象或 http_build_query
的附加选项。 $prefix
参数用于递归,在初始调用时应省略。
function http_clean_query(array $query_data, string $prefix=null): string {
$parts = [];
$i = 0;
foreach ($query_data as $key=>$value) {
if ($prefix === null) {
$key = rawurlencode($key);
} else if ($key === $i) {
$key = $prefix.'[]';
$i++;
} else {
$key = $prefix.'['.rawurlencode($key).']';
}
if (is_array($value)) {
if (!empty($value)) $parts[] = http_clean_query($value, $key);
} else {
$parts[] = $key.'='.rawurlencode($value);
}
}
return implode('&', $parts);
}
关于php - http_build_query 函数的 urlencoding 过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21046623/
我有一个 URL,它通过 http_build_query 函数变成了一个查询字符串。 但是我有一个无法编辑的参数timestamp。而 × 变成乘号 x。 有解决办法吗? 这是我传递给 http_b
我想使用 http_build_query 构建这个 url: https://www.googleapis.com/freebase/v1/topic/m/0d6lp?filter=/common/
请检查以下数组: Array([bunrey] => Array ([0] => 20130730181908615391000000) [mt.shasta] => Array (
有没有办法使用同名参数通过 http_build_query 自动构建查询? 如果我做类似的事情 array('foo' => 'x', 'foo' => 'y'); 它们显然在数组中被覆盖了,但即使
您好,我正在使用此代码发布 url 并获取结果,但它在每个结果之前添加 =0 我的代码是 In this demonstration: >tts is done on server si
我需要使用 HttpWebRequest 将一些数据从我的 C# 客户端传递到服务器上的 PHP 页面.根据文档的预期数据是一个数组数组,如下所示: $postData = array( 'l
当数组键也是 html-char 代码时,使用 http_build_query() 将数组编码为 URL 会产生奇怪的行为。 例如: return http_build_query([ 'id
我完全是 PHP 的新手,我尝试寻找解决方案,但似乎找不到。 每当我尝试在我的数组上使用 http_build_query() 时,它会将 $note 变量变成一个符号 (¬e)。我只是想知道是否有任
我只是发现这些功能似乎是多余的。http_build_query() 属于标准的php函数。http_build_str() 是 pecl_http 包的一部分。 它们是 100% 冗余的吗? 我专注
我今天遇到了一个问题,我将一个值设置为空数组的键传递给 http_build_query()。例如: $args = array("foo", "bar", array(), "baz"); $qs
为什么在使用 http_build_query 函数构建查询字符串时,它会将方括号 [] urlencode 到值之外,如何摆脱它? $query = array("var" => array("fo
有没有办法使用 http_build_query() 而无需根据某些 RFC 标准对其进行 URL 编码? 为什么我不想对所有内容进行 URL 编码:我正在查询 Ebay API。他们诚实地坚持参数名
这个问题在这里已经有了答案: How do I pass variables and data from PHP to JavaScript? (19 个回答) 关闭 9 年前。 为什么这不起作用?
我需要使用 http_build_query 创建一个 POST 请求。以下是我的代码: $uri_args = array ( 'name' => 'Jack', 'surn
http_build_query($array) 将数组转换成a=1&b=2的格式, 但是如何让它转换成a=1;b=2的格式呢? 那里有原生函数吗? 最佳答案 第三个参数为http_build_que
我有一个包含我的数据的 map ,我想用它构建一个查询字符串,就像我在 PHP 上使用 http_build_query 一样。我不确定这段代码是否是它的最佳实现,或者我是否忘记了什么? public
'bar', 'baz'=>'boom', 'cow'=>'milk', 'php'=>'hypertext pro
这段代码: $query = array( "var" => "no", "not_var" => "yes", "var2" => "maybe" ); print http
我是一名优秀的程序员,十分优秀!