在PHP中解码查询字符串
好的,所以我使用mod_rewrite和PHP编写了一个REST API实现。我通过HTTP DELETE请求(... collective groan?)接受查询字符串。除了前面两种语句的智慧之外,我发现PHP不会自动分析DELETE请求的请求体(即尽管表单编码的查询字符串出现在请求体中,$ _POST仍然是空的)。这并没有让我感到特别意外。我发现令人惊讶的是,我一直无法找到一个用于解析查询字符串的内置PHP函数?我只是忽略了一些东西?我可以这样做:在PHP中解码查询字符串
public function parseQS($queryString, &$postArray){
$queryArray = explode('&', $queryString);
for($i = 0; $i < count($queryArray); $i++) {
$thisElement = split('=', $queryArray[$i]);
$postArray[$thisElement[0]] = htmlspecialchars(urldecode($thisElement[1]));
}
}
......这似乎很奇怪,没有内置的PHP来处理这个问题。此外,我怀疑我不应该使用urldecode来清理表单编码的值......它是一种不同的编码,但我也无法辨别哪个PHP函数应该用于解码表单编码的数据。
任何建议,将不胜感激。
public function parseQS($queryString, &$postArray){
parse_str($queryString, $postArray);
}
;-)
哈哈...显然。 – codemonkey 2009-07-16 17:21:13
有人对此投票?他显然是在开玩笑......并不是真的建议我用我的功能包装内置。 – codemonkey 2009-07-16 17:24:01
有是做它的功能 - http://php.net/parse_str。由于PHP必须自己做这件事,所以没有理由不将它打开以便在API中使用。
将字符串到变量空隙 parse_str(字符串$ STR [,阵列& $ ARR])
解析str作为好像它是查询 串经由URL传递并设置 变量在当前范围。
<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str, $output);
echo $output['first']; // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz
http://us2.php.net/manual/en/function.parse-url.php
parse_url将帮助您抓住DOCUMENT_URI的包含实际查询的部分。
然后,您可以将该部分传递给parse_str以从查询中提取单个元素。
有趣...我不知道是否有利用这个而不是@file_get_contents('php:// input')...这是我目前使用的。 – codemonkey 2009-07-16 17:35:28
parse_str
sucks。
parse_str
适用于简单的东西,但它不像PHP创建$_GET
魔术变量的内置方式那样。为什么?!?我不知道。我开发了自己的版本,我相信它完全符合PHP的解析(让我知道是否可以找到任何其他示例)。
function betterParseStr($string)
{
return array_reduce(explode("&", $string), function($array, $string_piece) {
if($string_piece === "") return $array;
$equal_offset = strpos($string_piece, "=");
if($equal_offset === FALSE) {
$key = urldecode($string_piece);
$value = "";
} else {
$key = urldecode(substr($string_piece, 0, $equal_offset));
$value = urldecode(substr($string_piece, $equal_offset + 1));
}
if(preg_match("/^([^\[]*)\[([^\]]*)](.*)$/", $key, $matches)) {
$key_path = array($matches[1], $matches[2]);
$rest = $matches[3];
while(preg_match("/^\[([^\]]*)](.*)$/", $rest, $matches)) {
$key_path[] = $matches[1];
$rest = $matches[2];
}
} else {
//replace first [ for _
//why?!? idk ask PHP it does
//Example: ?key[[=value -> array("key_[" => "value")
$key_path = array(preg_replace('/\[/', '_', $key, 1));
}
if(strlen($key_path[0]) > 0 && substr($key_path[0], 0, 1) !== "[") {
$current_node = &$array;
$last_key = array_pop($key_path);
$resolve_key = function($key, array $array) {
if($key === "" || $key === " ") {
$int_array = array_filter(array_keys($array), function($key) { return is_int($key); });
$key = $int_array ? max($int_array) + 1 : 0;
}
return $key;
};
foreach($key_path as $key_path_piece) {
$key_path_piece = $resolve_key($key_path_piece, $current_node);
if(! array_key_exists($key_path_piece, $current_node) || ! is_array($current_node[$key_path_piece])) {
$current_node[$key_path_piece] = array();
}
$current_node = &$current_node[$key_path_piece];
}
$current_node[$resolve_key($last_key, $current_node)] = $value;
}
return $array;
}, array());
}
我已经构建了一个简单的库来解析查询字符串来筛选,排序,并选择我的休息API的字段。 odata的天真版本。 将查询字符串转换为对象和/或对象数组。 用于离:
过滤器:
www.example.com/[email protected]=filedName operator 'the value'
可用运算当量,NE,GT,LT,等,ILIKE,LE,GE
$filtersResult = $parser->filters();
$filtersResult[0]->field // name
$filtersResult[0]->operator // eq
$filtersResult[0]->getOperator() // "="
$filtersResult[0]->value // 'what ever'
排序:
//name is asc , surname desc
@orderby=name,-surname
$sorts = $parser->orderBy() // you can set defaults if u want
$sorts[0]->filed //name
$sorts[0]->direction //asc
$sorts[1]->filed //surname
$sorts[1]->direction //desc
嵌入的
:
@embed=resourceOne(@fields=name,code)(@filters=nameembed eq 'what ever'),mobiles(@orderby=sortFieldOne)
$embedResult = $parser->embed(); //return array of embed each
//object contains filters , sort , fields | empty array
$embedResult[0]->resource // resourceOne
$embedResult[0]->fields // array of fields [name,code]
$embedResult[0]->filters // array of filters or empty array
$embedResult[1]->resource // mobiles
$embedResult[1]->orderBy // array of order by objects
'parse_str'不处理解析'$ _GET'酷似PHP做(不知道为什么)。看到我的答案为我的“解决方案”。 – 2012-06-22 19:22:38