获取URL查询字符串参数

什么是“更少的代码所需”的方式,以获得参数从一个URL查询字符串的格式如下?

www.mysite.com/category/subcategory ? myqueryhash

输出应该是:myqueryhash

我知道这种做法:

www.mysite.com/category/subcategory?q=myquery


<?php
echo $_GET['q'];  //Output: myquery
?>
952093 次浏览

$_SERVER['QUERY_STRING']包含你正在寻找的数据。


文档

如果你想要整个查询字符串:

$_SERVER["QUERY_STRING"]

函数parse_str()自动将所有查询参数读入数组。

例如,如果URL是http://www.example.com/page.php?x=100&y=200,则代码

$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);

将参数值存储到$queries数组($queries['x']=100$queries['y']=200)中。

看看parse_str的文档


编辑

根据PHP文档,parse_str()只能与第二个参数(数组)一起使用。在这个URL上使用parse_str($_SERVER['QUERY_STRING'])将创建变量$x$y,这使得代码容易受到诸如http://www.example.com/page.php?authenticated=1之类的攻击。

PHP的方法是使用parse_url函数,它解析URL并返回其组件。包括查询字符串。

例子:

$url = 'www.mysite.com/category/subcategory?myqueryhash';
echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"

完整的文档在这里

此外,如果您正在与查询字符串一起查找当前文件名,则只需要以下内容

basename($_SERVER['REQUEST_URI'])

它将为您提供如下示例的信息

file.php ? __arg1 = val&最长=瓦尔

如果你也想从根目录开始文件的完整路径,例如/folder/folder2/file.php?arg1=val&arg2=val然后删除basename()函数,只使用填充

$_SERVER['REQUEST_URI']

下面是重建上线的查询字符串部分的函数。

如果调用页已经在它自己的URL中有一个查询字符串,并且你必须回到该页并想要返回一些而不是全部的$_GET变量(例如一个页码)。

示例:Referrer的查询字符串为?foo=1&bar=2&baz=3,调用refererQueryString( 'foo' , 'baz' )返回foo=1&baz=3":

function refererQueryString(/* var args */) {


//Return empty string if no referer or no $_GET vars in referer available:
if (!isset($_SERVER['HTTP_REFERER']) ||
empty( $_SERVER['HTTP_REFERER']) ||
empty(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY ))) {


return '';
}


//Get URL query of referer (something like "threadID=7&page=8")
$refererQueryString = parse_url(urldecode($_SERVER['HTTP_REFERER']), PHP_URL_QUERY);


//Which values do you want to extract? (You passed their names as variables.)
$args = func_get_args();


//Get '[key=name]' strings out of referer's URL:
$pairs = explode('&',$refererQueryString);


//String you will return later:
$return = '';


//Analyze retrieved strings and look for the ones of interest:
foreach ($pairs as $pair) {
$keyVal = explode('=',$pair);
$key = &$keyVal[0];
$val = urlencode($keyVal[1]);
//If you passed the name as arg, attach current pair to return string:
if(in_array($key,$args)) {
$return .= '&'. $key . '=' .$val;
}
}


//Here are your returned 'key=value' pairs glued together with "&":
return ltrim($return,'&');
}


//If your referer was 'page.php?foo=1&bar=2&baz=3'
//and you want to header() back to 'page.php?foo=1&baz=3'
//(no 'bar', only foo and baz), then apply:


header('Location: page.php?'.refererQueryString('foo','baz'));

要获取URI中的每个节点,可以使用函数explode() For $_SERVER['REQUEST_URI']。如果你想在不知道它们是否被传递的情况下获取字符串,你可以使用我自己定义的函数从$_REQUEST中获取查询参数(因为它对POST和get参数都有效)。

function getv($key, $default = '', $data_type = '')
{
$param = (isset($_REQUEST[$key]) ? $_REQUEST[$key] : $default);


if (!is_array($param) && $data_type == 'int') {
$param = intval($param);
}


return $param;
}

在某些情况下,我们可能希望将查询参数转换为Integer类型,因此我在此函数中添加了第三个参数。

我将推荐最佳答案为:

<?php
echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!';
?>

假设用户输入http://example.com/?name=Hannes

上面的例子将输出:

你好汉斯·!

这段代码和符号不是我的。Evan K用一个自定义函数解决了一个多值同名查询;)

http://php.net/manual/en/function.parse-str.php#76792 有请Evan K.

值得一提的是,当涉及到重复字段时,parse_str内置并不以CGI标准方式处理查询字符串。如果查询字符串中存在多个相同名称的字段,其他web处理语言都会将它们读入数组,但PHP会默默地覆盖它们:

<?php
# silently fails to handle multiple values
parse_str('foo=1&foo=2&foo=3');


# the above produces:
$foo = array('foo' => '3');
?>

相反,PHP使用了一种非标准兼容的实践,即在字段名中包含括号,以达到相同的效果。

<?php
# bizarre php-specific behavior
parse_str('foo[]=1&foo[]=2&foo[]=3');


# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>

这可能会让任何习惯CGI标准的人感到困惑,所以请记住它。作为替代,我使用"查询字符串解析器函数:

<?php
function proper_parse_str($str) {
# result array
$arr = array();


# split on outer delimiter
$pairs = explode('&', $str);


# loop through each pair
foreach ($pairs as $i) {
# split into name and value
list($name,$value) = explode('=', $i, 2);
    

# if name already exists
if( isset($arr[$name]) ) {
# stick multiple values into an array
if( is_array($arr[$name]) ) {
$arr[$name][] = $value;
}
else {
$arr[$name] = array($arr[$name], $value);
}
}
# otherwise, simply stick it in a scalar
else {
$arr[$name] = $value;
}
}


# return result array
return $arr;
}


$query = proper_parse_str($_SERVER['QUERY_STRING']);
?>

感谢@K。沙赫扎德。

当您希望重写查询字符串而不添加任何重写内容时,这将有所帮助。假设你重写/test/?X =y到index.php?q=test& X =y并且你只想要查询字符串。

function get_query_string(){


$arr = explode("?", $_SERVER['REQUEST_URI']);
if (count($arr) == 2){
return "";
}
else{
return "?" . end($arr) . "<br>";
}
}
$query_string = get_query_string();

编程语言:PHP

// Inintialize a URL to the variable
$url = 'https://www.youtube.com/watch?v=qnMxsGeDz90';
    

// Use parse_url() function to parse the URL
// and return an associative array which contains its various components
$url_components = parse_url($url);


// Use the parse_str() function to parse the
// string passed via the URL
parse_str($url_components['query'], $params);
    

// Display result
echo 'v parameter value is ' . $params['v'];

这对我很管用。