从“GET”参数中获取值(JavaScript)

1727

我有一个带有GET参数的URL,如下所示:

www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 

我需要获取整个 c 的值。我尝试读取URL,但我只得到了 m2 。如何使用JavaScript实现这一点?


9
在发表新回答之前,请考虑已经有50多个回答了。请确保您的回答提供的信息不在现有的答案中。 - janniks
var url_string = "http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; //window.location.href var url = new URL(url_string); var c = url.searchParams.get("c"); console.log(c); - Ali NajafZadeh
1
真是疯狂,一个本应该很简单的JS问题需要50多个答案 :/ - fguillen
63个回答

32

我写了一个函数来实现这个功能:

var getUrlParams = function (url) {
  var params = {};
  (url + '?').split('?')[1].split('&').forEach(function (pair) {
    pair = (pair + '=').split('=').map(decodeURIComponent);
    if (pair[0].length) {
      params[pair[0]] = pair[1];
    }
  });
  return params;
};

更新于2017年5月26日,这里是一个ES7实现(需要运行在babel预设的stage 0、1、2或3上):

const getUrlParams = url => `${url}?`.split('?')[1]
  .split('&').reduce((params, pair) =>
    ((key, val) => key ? {...params, [key]: val} : params)
    (...`${pair}=`.split('=').map(decodeURIComponent)), {});

一些测试:

console.log(getUrlParams('https://google.com/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('https://google.com/')); // Will log {}
console.log(getUrlParams('a=1&b=2&c')); // Will log {}

更新于2018年3月26日,以下是TypeScript的实现:

const getUrlParams = (search: string) => `${search}?`
  .split('?')[1]
  .split('&')
  .reduce(
    (params: object, pair: string) => {
      const [key, value] = `${pair}=`
        .split('=')
        .map(decodeURIComponent)

      return key.length > 0 ? { ...params, [key]: value } : params
    },
    {}
  )

更新于 2019 年 2 月 13 日,这里有一个更新的 TypeScript 实现,适用于 TypeScript 3。

interface IParams { [key: string]: string }

const paramReducer = (params: IParams, pair: string): IParams => {
  const [key, value] = `${pair}=`.split('=').map(decodeURIComponent)

  return key.length > 0 ? { ...params, [key]: value } : params
}

const getUrlParams = (search: string): IParams =>
  `${search}?`.split('?')[1].split('&').reduce<IParams>(paramReducer, {})

在没有查询参数的URL上,这将返回Object {"": ""} - Ilya Semenov
2
看起来对我来说很干净。其他答案只是太多的“魔法”,没有足够的解释。 - Levi Roberts
这是一个很棒的答案! - Spencer Bigum
谢谢@SpencerBigum! - Nate Ferrero

26

点击这里

function getURLParameters(paramName)
{
    var sURL = window.document.URL.toString();
    if (sURL.indexOf("?") > 0)
    {
        var arrParams = sURL.split("?");
        var arrURLParams = arrParams[1].split("&");
        var arrParamNames = new Array(arrURLParams.length);
        var arrParamValues = new Array(arrURLParams.length);

        var i = 0;
        for (i = 0; i<arrURLParams.length; i++)
        {
            var sParam =  arrURLParams[i].split("=");
            arrParamNames[i] = sParam[0];
            if (sParam[1] != "")
                arrParamValues[i] = unescape(sParam[1]);
            else
                arrParamValues[i] = "No Value";
        }

        for (i=0; i<arrURLParams.length; i++)
        {
            if (arrParamNames[i] == paramName)
            {
                //alert("Parameter:" + arrParamValues[i]);
                return arrParamValues[i];
            }
        }
        return "No Parameters Found";
    }
}

25

最短的方法:

new URL(location.href).searchParams.get("my_key");

3
我倾向使用 new URL(location.href).searchParams.get("my_key") 而不是 URLSearchParams,因为后者在检索任何URL的第一个查询参数时会失败。 - Travis Clarke
1
测试了两种变体。我同意您的观点。编辑了答案。 - Zon

20

ECMAScript 6 解决方案:

var params = window.location.search
  .substring(1)
  .split("&")
  .map(v => v.split("="))
  .reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map())

很好。顺便提一下,因为它是一个Map,使用方法是params.get("key"); - evanmcd
我喜欢它,但可能不会得到第一个参数。我根据你的示例创建了一个函数。function urlParams(url) { const [, searchParams = ''] = url.split('?') return searchParams.split('&') .map(v => v.split('=')) .reduce((map, [key = '', value]) => key.length ? map.set(key, decodeURIComponent(value)) : map, new Map()) } - marianocodes

15

我使用parseUri库。它可以让您正好做您所要求的操作:

var uri = 'www.test.com/t.html&a=1&b=3&c=m2-m3-m4-m5';
var c = uri.queryKey['c'];
// c = 'm2-m3-m4-m5'

12

我使用

function getVal(str) {
    var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
    return v ? v[1] : null;
}

请添加一些解释。您的答案当前被标记为“低质量”,可能会被删除。 - Johannes Jander
我发现如果URL末尾有一个类似于“#id”的字符串,并返回最后一个参数值,例如“somevalue#id”。 - Ayano
@Ayano,window.location.search 不包括如 #id 的哈希部分。 - Fancyoung
@Fancyoung 是的,你说得对,我犯了一个错误,使用了 location.href 来匹配结果,而不是 location.search。谢谢。 - Ayano

11

这是我的解决方案。在回答这个问题时,Andy E建议说,如果脚本为了获取单个值而重复构建各种正则表达式字符串、运行循环等,对脚本的性能不利。因此,我想出了一个更简单的脚本,它将所有GET参数返回到一个对象中。您应该只调用它一次,并将结果分配给一个变量,然后在未来的任何时间点,使用相应的键从该变量中获取您想要的任何值。请注意,它还会处理URI解码(即像%20这样的内容),并将加号替换为空格:

 function getUrlQueryParams(url) {
  var queryString = url.split("?")[1];
  var keyValuePairs = queryString.split("&");
  var keyValue = [];
  var queryParams = {};
  keyValuePairs.forEach(function(pair) {
    keyValue = pair.split("=");
    queryParams[keyValue[0]] = decodeURIComponent(keyValue[1]).replace(/\+/g, " ");
});
  return queryParams;
}

所以,这里有一些脚本测试供您查看:

// Query parameters with strings only, no special characters.
var currentParams = getUrlQueryParams("example.com/foo?number=zero");
alert(currentParams["number"]); // Gives "zero".

// For the URL you stated above...
var someParams = getUrlQueryParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 ");
alert(someParams["c"]); // Gives "m2-m3-m4-m5".

// For a query params with URI encoding...
var someParams = getUrlQueryParams("www.example.com/t.html?phrase=a%20long%20shot&location=Silicon+Valley%2C+USA");
alert(someParams["phrase"]); // Gives "a long shot".
alert(someParams["location"]); // Gives "Silicon Valley, USA".

.replace("+", " ") 只会替换第一个出现的加号,你需要使用 .replace(/+/g, " "); - Tony

10

这个问题有太多的答案,所以我要再添加一个。

/**
 * parses and returns URI query parameters 
 * 
 * @param {string} param parm
 * @param {bool?} asArray if true, returns an array instead of a scalar 
 * @returns {Object|Array} 
 */
function getURIParameter(param, asArray) {
    return document.location.search.substring(1).split('&').reduce(function(p,c) {
        var parts = c.split('=', 2).map(function(param) { return decodeURIComponent(param); });
        if(parts.length == 0 || parts[0] != param) return (p instanceof Array) && !asArray ? null : p;
        return asArray ? p.concat(parts.concat(true)[1]) : parts.concat(true)[1];
    }, []);
}

使用方法:

getURIParameter("id")  // returns the last id or null if not present
getURIParameter("id", true) // returns an array of all ids

这可以处理空参数(指那些在没有"=value"的情况下存在的键),暴露标量和基于数组的值检索API,以及适当的URI组件解码。


10

使用replace()方法的最简单方式:

urlStr字符串中:

paramVal = urlStr.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

从当前的URL:

paramVal = document.URL.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

解释:

  • document.URL - 接口以字符串形式返回文档位置(页面 URL)。
  • replace() - 方法返回一个新字符串,其中某些或所有匹配的模式替换字符串替换。
  • /.*param_name=([^&]*).*/ - 两个斜杠之间包含的正则表达式模式的含义为:
    • .* - 零个或多个任何字符,
    • param_name= - 要搜索的参数名称,
    • () - 正则表达式中的组,
    • [^&]* - 一个或多个不包括&字符,
    • | - 或者,
    • $1 - 引用正则表达式中第一个组.

var urlStr = 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5';
var c = urlStr.replace(/.*c=([^&]*).*|(.*)/, '$1');
var notExisted = urlStr.replace(/.*not_existed=([^&]*).*|(.*)/, '$1');
console.log(`c === '${c}'`);
console.log(`notExisted === '${notExisted}'`);


1
不错的解决方案,但如果找不到参数,整个字符串会被返回。在这种情况下,我希望返回"undefined"。 - pensan
1
嗨@pensan,感谢您的精彩评论。我只是在正则表达式中添加了当参数未出现在URL中的情况处理。在这种情况下,我们得到空字符串(而不是整个字符串)。 - simhumileco

8
我有读取URL GET变量并根据url参数执行操作的需求。我寻找了很多解决方案,最终发现了这个小代码片段。它基本上读取当前页面的URL,对URL进行一些正则表达式处理,然后将URL参数保存在一个关联数组中,我们可以轻松地访问它们。
所以,举个例子,如果我们有以下URL,并在底部添加了JavaScript代码。
http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July

我们只需要调用以下代码即可获取参数id和page: 代码如下:
<script type="text/javascript">
var first = getUrlVars()["year"];
var second = getUrlVars()["Month"];

alert(first);
alert(second);
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script>

我不明白为什么你撤销了我对你的回答所做的修改。不过你可以自己改进它 :) - Michael Sørensen
无法处理类似于? action = api_call&dates [] = 2022-01-28&dates [] = 2022-02-03的URL。 - Codextent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接