假设我收到的请求如下:
http://www.example.com/index.php?id=123&version=3&id=234&version=4
是否可以在我的PHP代码中以简单的方式提取这些内容?我意识到我可以使用window.location.href使用javascript获取整个查询字符串并手动处理它但我正在寻找更优雅的东西。请求可以包含任意数量的版本/ ID对,但我可以假设查询格式正确,并且没有义务处理无效字符串。
答案 0 :(得分:24)
如果您可以更改字段名称以包含[]
,那么PHP将创建一个包含所有匹配值的数组:
http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4
如果您无法更改字段名称,那么正如您所说,您必须自己解析查询字符串。
答案 1 :(得分:7)
根据this comment from the PHP manual,PHP的查询字符串解析器将删除重复的参数...所以我不认为PHP非常适合您想要做的事情(除了它具有相同的容量) javascript以获取原始查询字符串,您可以使用它来执行任何操作)
答案 2 :(得分:1)
假设您对请求有一些控制权,请将名称加上[]
后缀,PHP将生成数组,而不是丢弃除了一个数组。
http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4
由于它们是对,您可能希望修复它们在使用索引时出现的顺序。
http://www.example.com/index.php?id[0]=123&version[0]=3&id[1]=234&version[1]=4
答案 3 :(得分:1)
只需提取$ _GET的键和值,使用以下函数:
print_array('$_GET...',$_GET);
...功能代码为:
function print_array($title, $arr) {
echo '<table width="100%" style="padding:10;">';
echo '<tr><td width="30%" style="text-align:right; background-color:bisque;">key of </td><td style="background-color:bisque;">'.$title.'</td></tr>';
foreach($arr as $key => $value) {
echo '<tr>';
echo '<td style="text-align:right; color:grey;">';
echo $key;
echo '</td>';
echo '<td>';
echo $value;
echo '</td>';
echo '</tr>';
}
echo '</table>';
}
答案 4 :(得分:0)
不像上面提到的方法那样圆润或可靠,但我使用它来删除网址中[]
的必要性而不用担心重写。
$aQuery = explode("&", $_SERVER['QUERY_STRING']);
$aQueryOutput = array();
foreach ($aQuery as $param) {
if(!empty($param)){
$aTemp = explode('=', $param, 2);
if(isset($aTemp[1]) && $aTemp[1] !== ""){
list($name, $value) = explode('=', $param, 2);
$aQueryOutput[ strtolower(urldecode($name)) ][] = urldecode(preg_replace('/[^a-z 0-9\'+-]/i', "", $value));
}
}
}