13

假设我收到以下请求:

http://www.example.com/index.php?id=123&version=3&id=234&version=4

是否可以在我的 php 代码中以简单的方式提取这些?我意识到我可以使用window.location.href 使用javascript 获取整个查询字符串并手动处理它,但我正在寻找更优雅的东西。请求可以包含任意数量的版本/ID 对,但我可以假设查询格式正确并且没有义务处理无效字符串。

4

5 回答 5

27

如果您可以将字段名称更改为 include [],那么 PHP 将创建一个包含所有匹配值的数组:

http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4

如果您无法更改字段名称,那么正如您所说,您必须自己解析查询字符串。

于 2010-10-20T16:48:04.243 回答
8

根据PHP 手册中的这条评论,PHP 的查询字符串解析器将删除重复的参数......所以我认为 PHP 不适合你想做的事情(除了它具有与 javascript 相同的能力获取原始查询字符串,你可以用它做任何你想做的事情)

于 2010-10-20T16:45:05.947 回答
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
于 2010-10-20T16:49:00.350 回答
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>';
}
于 2014-07-28T11:46:02.787 回答
1

不像上面提到的方法那样圆润或可靠,但我用它来消除对[]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));
        }
    }
}
于 2016-12-16T16:02:50.307 回答