假设我收到以下请求:
http://www.example.com/index.php?id=123&version=3&id=234&version=4
是否可以在我的 php 代码中以简单的方式提取这些?我意识到我可以使用window.location.href 使用javascript 获取整个查询字符串并手动处理它,但我正在寻找更优雅的东西。请求可以包含任意数量的版本/ID 对,但我可以假设查询格式正确并且没有义务处理无效字符串。
假设我收到以下请求:
http://www.example.com/index.php?id=123&version=3&id=234&version=4
是否可以在我的 php 代码中以简单的方式提取这些?我意识到我可以使用window.location.href 使用javascript 获取整个查询字符串并手动处理它,但我正在寻找更优雅的东西。请求可以包含任意数量的版本/ID 对,但我可以假设查询格式正确并且没有义务处理无效字符串。
如果您可以将字段名称更改为 include []
,那么 PHP 将创建一个包含所有匹配值的数组:
http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4
如果您无法更改字段名称,那么正如您所说,您必须自己解析查询字符串。
根据PHP 手册中的这条评论,PHP 的查询字符串解析器将删除重复的参数......所以我认为 PHP 不适合你想做的事情(除了它具有与 javascript 相同的能力获取原始查询字符串,你可以用它做任何你想做的事情)
假设您对请求有一定的控制权,给名称加上后缀[]
,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
只需提取 $_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>';
}
不像上面提到的方法那样圆润或可靠,但我用它来消除对[]
url 的需要,而不用担心重写。
$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));
}
}
}