如何从GET参数中获取值?

joe*_*joe 1255 javascript url

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

www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 
Run Code Online (Sandbox Code Playgroud)

我需要获得全部价值c.我试图读取URL,但我只是m2.我如何使用JavaScript执行此操作?

Que*_*tin 1833

JavaScript 本身没有内置处理查询字符串参数的内容.

在(现代)浏览器中运行的代码,您可以使用该URL对象(浏览器对JS浏览器的API浏览器的一部分):

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);
Run Code Online (Sandbox Code Playgroud)


对于旧版浏览器(包括Internet Explorer),您可以使用此polyfill或此答案的原始版本中的代码URL:

您可以访问location.search,这将从?字符到URL的末尾或片段标识符(#foo)的开头,以先到者为准.

然后你可以解析它:

function parse_query_string(query) {
  var vars = query.split("&");
  var query_string = {};
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var key = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);
    // If first entry with this name
    if (typeof query_string[key] === "undefined") {
      query_string[key] = decodeURIComponent(value);
      // If second entry with this name
    } else if (typeof query_string[key] === "string") {
      var arr = [query_string[key], decodeURIComponent(value)];
      query_string[key] = arr;
      // If third or later entry with this name
    } else {
      query_string[key].push(decodeURIComponent(value));
    }
  }
  return query_string;
}

var query_string = "a=1&b=3&c=m2-m3-m4-m5";
var parsed_qs = parse_query_string(query_string);
console.log(parsed_qs.c);
Run Code Online (Sandbox Code Playgroud)

您可以从当前页面的URL获取查询字符串:

var query = window.location.search.substring(1);
var qs = parse_query_string(query);
Run Code Online (Sandbox Code Playgroud)

  • @Jamland - 绝对不要那样做.它会破坏事物.[这是一个现场演示](https://jsbin.com/zokeguleso/1/edit?js,console)`new URL()`希望接收一个正确编码的URL作为其参数.`decodeURIComponent`希望传递一个URL的*component*,而不是整个URL. (7认同)

Ate*_*ral 240

我见过的大多数实现都错过了URL解码名称和值.

这是一个通用的实用函数,也可以进行正确的URL解码:

function getQueryParams(qs) {
    qs = qs.split('+').join(' ');

    var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }

    return params;
}

//var query = getQueryParams(document.location.search);
//alert(query.foo);
Run Code Online (Sandbox Code Playgroud)

  • 为什么`qs.split('+').join('');`而不是`qs.replace(/\+/g,'');`? (5认同)
  • 此代码不起作用.它创建了一个无限循环,因为正则表达式是在循环定义中编译的,它会重置当前索引.如果将正则表达式放在循环外的变量中,它可以正常工作. (3认同)
  • @ZiTAL此函数用于URL的查询部分,而不是整个URL.请参阅下面注释掉的用法示例. (3认同)
  • @maxhawkins:它可以在某些浏览器中运行,而在其他浏览器中会进入无限循环.在这方面你是对的.我将修改代码为跨浏览器.感谢您指出了这一点! (2认同)
  • @Harvey 不区分大小写不是查询参数的问题。这听起来像是一个特定于应用程序的东西,应该与查询参数提取一起应用,或者在查询参数提取之上应用。 (2认同)

Hai*_*vgi 227

资源

function gup( name, url ) {
    if (!url) url = location.href;
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( url );
    return results == null ? null : results[1];
}
gup('q', 'hxxp://example.com/?q=abc')
Run Code Online (Sandbox Code Playgroud)

  • 请引用您的来源:http://www.netlobo.com/url_query_string_javascript.html (12认同)
  • 我最喜欢这个选项,但更喜欢返回null或结果,但不是空字符串. (8认同)
  • @mottie死链接 (5认同)
  • 看起来你有一些额外的转义字符。“\\\[“ 应该 ”\\[”。由于这些是常规字符串,因此不需要转义 [ 和 ]。 (2认同)

mza*_*zar 196

这是检查一个参数的简单方法:

示例网址:

    http://myserver/action?myParam=2
Run Code Online (Sandbox Code Playgroud)

示例Javascript:

    var myParam = location.search.split('myParam=')[1]
Run Code Online (Sandbox Code Playgroud)

如果URL中存在"myParam"...变量myParam将包含"2",否则它将是未定义的.

在这种情况下,也许你想要一个默认值:

    var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue';
Run Code Online (Sandbox Code Playgroud)

更新:这更好:

    var url = "http://www.example.com/index.php?myParam=384&login=admin"; // or window.location.href for current url
    var captured = /myParam=([^&]+)/.exec(url)[1]; // Value is in [1] ('384' in our case)
    var result = captured ? captured : 'myDefaultValue';
Run Code Online (Sandbox Code Playgroud)

即使URL充满参数,它也能正常工作.

  • `(location.search.split('myParam =')[1] ||'').split('&')[0]` - 用于**多个params**或**possibliy missing**`myParam`. (38认同)
  • 这只适用于您抓取的参数是URL中的最后一个参数,您不应该依赖它(即使您只需要一个参数).例如`http:// myserver/action?myParam = 2&anotherParam = 3`将不会产生`"2"`但是`"2&anotherParam = 3"`. (34认同)
  • 或 `location.search.split('myParam=').splice(1).join('').split('&amp;')[0]` (2认同)
  • 您可以通过在前面添加“[?|&amp;]”来获得更高的精度并允许任何参数顺序,如“[?|&amp;]myParam=([^&amp;]+)” (2认同)
  • 您可能需要解码值“result =decodeURIComponent(result);” (2认同)

cga*_*ian 117

浏览器供应商已经通过URL和URLSearchParams实现了本机方式.

let url = new URL('http://www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5');
let searchParams = new URLSearchParams(url.search);
console.log(searchParams.get('c'));  // outputs "m2-m3-m4-m5"
Run Code Online (Sandbox Code Playgroud)

目前支持Firefox,Opera,Safari,Chrome和Edge.有关浏览器支持的列表,请参阅此处.

自由软件开发人员网站 htt

https://url.spec.whatwg.org/

Google的工程师Eric Bidelman 建议将此polyfill用于不受支持的浏览器.

  • 使用 `url.searchParams` 代替 `new URLSearchParams(url.search)`。 (6认同)
  • @Markouver不是polyfill照顾的吗?顺便说一句,Safari是现代的IE6 (2认同)

VaM*_*ose 80

我很久以前就发现了这个问题:

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,    
    function(m,key,value) {
      vars[key] = value;
    });
    return vars;
  }
Run Code Online (Sandbox Code Playgroud)

然后像这样称呼它:

var fType = getUrlVars()["type"];
Run Code Online (Sandbox Code Playgroud)

  • +1伟大的解决方案 - 优雅,高效和智能是使用条款.为了我的目的,比其他公认的解决方案更好 (5认同)
  • 非常好,它也可以使用 location.search 而不是 window.location.href (2认同)
  • 创建`parts`变量有什么意义? (2认同)
  • @pdxbmw 它没有用,应该被删除。该代码乍一看似乎很聪明,但实际上并没有经过深思熟虑。改进:对值使用 `decodeURIComponent()`,因为这是您通常想要使用的;使用 `window.location.search` 而不是 `window.location.href`,因为您只对参数感兴趣,而不是整个 url。 (2认同)
  • @Leif建议很有效.我输入了ID 142#,因为在URL的末尾是单击按钮时生成的#.离开这个函数`var vars = {}; window.location.search.replace(/ [?&] +([^ =&] +)=([^&]*)/ gi,function(m,key,value){vars [key] = value;} ); 返回vars;` (2认同)

Bli*_*ixt 76

您可以获取查询字符串location.search,然后您可以在问号后拆分所有内容:

var params = {};

if (location.search) {
    var parts = location.search.substring(1).split('&');

    for (var i = 0; i < parts.length; i++) {
        var nv = parts[i].split('=');
        if (!nv[0]) continue;
        params[nv[0]] = nv[1] || true;
    }
}

// Now you can get the parameters you want like so:
var abc = params.abc;
Run Code Online (Sandbox Code Playgroud)

  • URL解码参数名称和值怎么样? (3认同)
  • @Kafoso 这里没有明确的对错。首先,具有相同名称的重复字段没有指定的标准行为,并且由解析器来处理。此外,“[]”模式仅在某些情况下有意义(例如,PHP),而在其他情况下则没有意义。所以并不是“明显错误”——只是没有实现来处理您可能需要或不需要处理的非标准情况。 (2认同)

Nat*_*at8 37

我写了一个更简单优雅的解决方案.

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];
Run Code Online (Sandbox Code Playgroud)


Jai*_*Jai 30

这是一个递归解决方案,没有正则表达式,并且具有最小的突变(只有params对象被突变,我认为这在JS中是不可避免的).

它真棒,因为它:

  • 是递归的
  • 处理同名的多个参数
  • 很好地处理格式错误的参数字符串(缺少值,等等)
  • 如果'='在值中,则不会中断
  • 执行URL解码
  • 最后,它很棒,因为它......唉!

码:

var get_params = function(search_string) {

  var parse = function(params, pairs) {
    var pair = pairs[0];
    var parts = pair.split('=');
    var key = decodeURIComponent(parts[0]);
    var value = decodeURIComponent(parts.slice(1).join('='));

    // Handle multiple parameters of the same name
    if (typeof params[key] === "undefined") {
      params[key] = value;
    } else {
      params[key] = [].concat(params[key], value);
    }

    return pairs.length == 1 ? params : parse(params, pairs.slice(1))
  }

  // Get rid of leading ?
  return search_string.length == 0 ? {} : parse({}, search_string.substr(1).split('&'));
}

var params = get_params(location.search);

// Finally, to get the param you want
params['c'];
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么有些东西是好的,因为它是递归的. (45认同)
  • 你...你说两次递归. (30认同)
  • 呃,我想你错过了亚当那里的递归笑话.虽然现在每个人都会错过它,因为edi9999删除了第二个"Is recursive". (6认同)

Nat*_*ero 27

我做了一个功能:

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;
};
Run Code Online (Sandbox Code Playgroud)

更新5/26/2017,这是一个ES7实现(运行babel预设阶段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)), {});
Run Code Online (Sandbox Code Playgroud)

一些测试:

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 {}
Run Code Online (Sandbox Code Playgroud)

更新3/26/2018,这是一个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
    },
    {}
  )
Run Code Online (Sandbox Code Playgroud)

更新2/13/2019,这是一个更新的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, {})
Run Code Online (Sandbox Code Playgroud)

  • 看起来很干净对我来说.其余的答案太过"神奇"而没有足够的解释. (2认同)

Dhi*_*dya 24

看到这个

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";
    }
}
Run Code Online (Sandbox Code Playgroud)


spe*_*.sm 24

使用URLSearchParams的一种超级简单的方法.

function getParam(param){
  return new URLSearchParams(window.location.search).get(param);
}
Run Code Online (Sandbox Code Playgroud)

它目前支持Chrome,Firefox,Safari,Edge .


vei*_*set 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())
Run Code Online (Sandbox Code Playgroud)


Chr*_*row 11

我使用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'
Run Code Online (Sandbox Code Playgroud)


Fan*_*ung 11

我用

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


Mav*_*101 9

这是我的解决方案.正如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;
}
Run Code Online (Sandbox Code Playgroud)

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

// 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".
Run Code Online (Sandbox Code Playgroud)


Rav*_*tel 8

对于单个参数值,如index.html?msg = 1使用以下代码,

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search.substring(1);
    var varArray = queryString.split("="); //eg. index.html?msg=1

    var param1 = varArray[0];
    var param2 = varArray[1];

}
Run Code Online (Sandbox Code Playgroud)

对于所有参数值使用以下代码,

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search;
    var varArray = queryString.split("&");
    for (var i=0;i<varArray.length;i++) {
      var param = varArray[i].split("=");
        //parameter-value pair
    }
} 
Run Code Online (Sandbox Code Playgroud)


Was*_*han 8

我需要读取 URL GET 变量并根据 url 参数完成操作。我四处寻找解决方案,并遇到了这段小代码。它基本上读取当前页面的 url,对 URL 执行一些正则表达式,然后将 url 参数保存在一个关联数组中,我们可以轻松访问它。

举个例子,如果我们有以下 url,底部的 javascript 就位。

http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July
Run Code Online (Sandbox Code Playgroud)

获取参数 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>
Run Code Online (Sandbox Code Playgroud)


Tys*_*son 7

这个问题的答案太多了,所以我又补充了一个.

/**
 * 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];
    }, []);
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

这可以处理空参数(没有存在的那些键"=value"),标量和基于数组的值检索API的暴露,以及正确的URI组件解码.


Gus*_*Gus 7

或者,如果您不想重新发明URI解析轮,请使用URI.js

要获取名为foo的参数的值:

new URI((''+document.location)).search(true).foo
Run Code Online (Sandbox Code Playgroud)

那是做什么的

  1. 将document.location转换为字符串(它是一个对象)
  2. 将该字符串提供给URI.js的URI类construtor
  3. 调用search()函数来获取url的搜索(查询)部分
    (传递true告诉它输出一个对象)
  4. 访问结果对象上的foo属性以获取值

这是一个小提琴.... http://jsfiddle.net/m6tett01/12/


Sar*_*'Cl 7

这里我发布一个例子.但它在jQuery中.希望它能帮助别人:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.url.js"></script>

<!-- URL:  www.example.com/correct/?message=done&year=1990-->

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')          // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')   // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});
</script>
Run Code Online (Sandbox Code Playgroud)


Zon*_*Zon 7

最短的方法:

new URL(location.href).searchParams.get("my_key");
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢使用`new URL(location.href).searchParams.get(“ my_key”)`而非`URLSearchParams`,因为后者在检索任何URL的第一个查询参数时将失败。 (2认同)

Kha*_*jdi 7

这是我寻找一种干净的方法来做到这一点的 N++ 时间。
将把它保存在这里,以防我回来,因为我知道我会......

const parseUrlQuery = (value) => {
  var urlParams = new URL(value).searchParams
  return Array.from(urlParams.keys()).reduce((acc, key) => {
    acc[key] = urlParams.getAll(key)
    return acc
  }, {})
}

console.log(parseUrlQuery('http://url/path?param1=A&param1=B&param2=ABC&param3=61569'))
Run Code Online (Sandbox Code Playgroud)


the*_*zar 6

// Read a page's GET URL variables and return them as an associative array.
function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

// Usage for URL: http://my.site.com/location?locationId=53cc272c0364aefcb78756cd&shared=false
var id = getUrlVars()["locationId"];
Run Code Online (Sandbox Code Playgroud)

来自这里:http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-with-jquery.html


小智 6

简单的方法

function getParams(url){
        var regex = /[?&]([^=#]+)=([^&#]*)/g,
            params = {},
            match;
        while(match = regex.exec(url)) {
            params[match[1]] = match[2];
        }
        return params;
    }
Run Code Online (Sandbox Code Playgroud)

然后像getParams(url)一样调用它


小智 6

优雅、实用的风格解决方案

让我们创建一个包含 URL 参数名称作为键的对象,然后我们可以通过名称轻松提取参数:

// URL: https://example.com/?test=true&orderId=9381  

// Build an object containing key-value pairs
export const queryStringParams = window.location.search
  .split('?')[1]
  .split('&')
  .map(keyValue => keyValue.split('='))
  .reduce<QueryStringParams>((params, [key, value]) => {
    params[key] = value;
    return params;
  }, {});

type QueryStringParams = {
  [key: string]: string;
};


// Return URL parameter called "orderId"
return queryStringParams.orderId;
Run Code Online (Sandbox Code Playgroud)


equ*_*ion 5

还有一个建议.

已经有一些好的答案,但我发现它们不必要地复杂且难以理解.这很简单,并返回一个简单的关联数组,其键名与URL中的标记名对应.

我为想要学习的人添加了一个带有评论的版本.

请注意,这依赖于jQuery($ .each)的循环,我建议使用它而不是forEach.我发现使用jQuery确保跨浏览器兼容性更简单,而不是插入单独的修补程序来支持旧版浏览器中不支持的新功能.

编辑:在我写完这篇文章之后,我注意到埃里克·艾略特的答案,几乎是相同的,尽管它使用forEach,而我一般反对(出于上述原因).

function getTokens(){
    var tokens = [];
    var query = location.search;
    query = query.slice(1);
    query = query.split('&');
    $.each(query, function(i,value){    
        var token = value.split('=');   
        var key = decodeURIComponent(token[0]);     
        var data = decodeURIComponent(token[1]);
        tokens[key] = data;
    });
    return tokens;
}
Run Code Online (Sandbox Code Playgroud)

评论版:

function getTokens(){
    var tokens = [];            // new array to hold result
    var query = location.search; // everything from the '?' onward 
    query = query.slice(1);     // remove the first character, which will be the '?' 
    query = query.split('&');   // split via each '&', leaving us an array of something=something strings

    // iterate through each something=something string
    $.each(query, function(i,value){    

        // split the something=something string via '=', creating an array containing the token name and data
        var token = value.split('=');   

        // assign the first array element (the token name) to the 'key' variable
        var key = decodeURIComponent(token[0]);     

        // assign the second array element (the token data) to the 'data' variable
        var data = decodeURIComponent(token[1]);

        tokens[key] = data;     // add an associative key/data pair to our result array, with key names being the URI token names
    });

    return tokens;  // return the array
}
Run Code Online (Sandbox Code Playgroud)

对于下面的示例,我们将假设此地址:

http://www.example.com/page.htm?id=4&name=murray
Run Code Online (Sandbox Code Playgroud)

您可以将URL标记分配给您自己的变量:

var tokens = getTokens();
Run Code Online (Sandbox Code Playgroud)

然后按名称引用每个URL标记,如下所示:

document.write( tokens['id'] );
Run Code Online (Sandbox Code Playgroud)

这将打印"4".

您也可以直接从函数中引用一个令牌名称:

document.write( getTokens()['name'] );
Run Code Online (Sandbox Code Playgroud)

...将打印"默里".


Bob*_*wed 5

这是我所做的:

var uriParams = getSearchParameters();
alert(uriParams.c);


// background functions:

// Get object/associative array of URL parameters
function getSearchParameters () {
  var prmstr = window.location.search.substr(1);
  return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {};
}

// convert parameters from url-style string to associative array
function transformToAssocArray (prmstr) {
  var params = {},
      prmarr = prmstr.split("&");

  for (var i = 0; i < prmarr.length; i++) {
    var tmparr = prmarr[i].split("=");
    params[tmparr[0]] = tmparr[1];
  }
  return params;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

// http:localhost:8080/path?param_1=a&param_2=b
var getParamsMap = function () {
    var params = window.location.search.split("&");
    var paramsMap = {};
    params.forEach(function (p) {
        var v = p.split("=");
        paramsMap[v[0]]=decodeURIComponent(v[1]);
    });
    return paramsMap;
};

// -----------------------

console.log(getParamsMap()["param_1"]);  // should log "a"     
Run Code Online (Sandbox Code Playgroud)


Joh*_*ers 5

Eldon McGuinness 的这篇 Gist是迄今为止我见过的最完整的 JavaScript 查询字符串解析器实现。

不幸的是,它是作为一个 jQuery 插件编写的。

我将它重写为 vanilla JS 并进行了一些改进:

function parseQuery(str) {
  var qso = {};
  var qs = (str || document.location.search);
  // Check for an empty querystring
  if (qs == "") {
    return qso;
  }
  // Normalize the querystring
  qs = qs.replace(/(^\?)/, '').replace(/;/g, '&');
  while (qs.indexOf("&&") != -1) {
    qs = qs.replace(/&&/g, '&');
  }
  qs = qs.replace(/([\&]+$)/, '');
  // Break the querystring into parts
  qs = qs.split("&");
  // Build the querystring object
  for (var i = 0; i < qs.length; i++) {
    var qi = qs[i].split("=");
    qi = qi.map(function(n) {
      return decodeURIComponent(n)
    });
    if (typeof qi[1] === "undefined") {
      qi[1] = null;
    }
    if (typeof qso[qi[0]] !== "undefined") {

      // If a key already exists then make this an object
      if (typeof (qso[qi[0]]) == "string") {
        var temp = qso[qi[0]];
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]] = [];
        qso[qi[0]].push(temp);
        qso[qi[0]].push(qi[1]);

      } else if (typeof (qso[qi[0]]) == "object") {
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]].push(qi[1]);
      }
    } else {
      // If no key exists just set it as a string
      if (qi[1] == "") {
        qi[1] = null;
      }
      qso[qi[0]] = qi[1];
    }
  }
  return qso;
}

// DEMO
console.log(parseQuery("?foo=bar&foo=boo&roo=bar;bee=bop;=ghost;=ghost2;&;checkbox%5B%5D=b1;checkbox%5B%5D=b2;dd=;http=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab&http=http%3A%2F%2Fw3schools2.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab"));
Run Code Online (Sandbox Code Playgroud)

另请参阅此 Fiddle


Dan*_*ski 5

一行且 IE11 友好:

> (window.location.href).match('c=([^&]*)')[1]
> "m2-m3-m4-m5"
Run Code Online (Sandbox Code Playgroud)


sim*_*eco 5

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

urlStr字符串:

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

从当前网址

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

说明:

  • document.URL -接口以字符串形式返回文档位置(页面url)。
  • replace()-方法返回一个新字符串,该字符串的某些或所有模式匹配都被替换替换
  • /.*param_name=([^&]*).*/- 包含在斜杠之间的正则表达式模式,这意味着:
    • .* -零个或多个字符,
    • param_name= -带有名字的参数名称,
    • () -以正则表达式分组
    • [^&]*-除以下字符之外的任何一个或多个字符&
    • | -交替
    • $1 -在正则表达式中引用第一组。

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


LoP*_*oBo 5

这是一个获取单个参数的简短函数:

function getUrlParam(paramName) {
    var match = window.location.search.match("[?&]" + paramName + "(?:&|$|=([^&]*))");
    return match ? (match[1] ? decodeURIComponent(match[1]) : "") : null;
}
Run Code Online (Sandbox Code Playgroud)

这些特殊情况的处理与 URLSearchParams 一致:

  • 如果参数缺失,null则返回。

  • 如果参数存在但没有“=”(例如“?param”),""则返回。

笔记!如果参数名称有可能包含特殊的 URL 或正则表达式字符(例如,如果它来自用户输入),则需要对其进行转义。这可以很容易地完成,如下所示:

function getUrlParamWithSpecialName(paramName) {
    return getUrlParam(encodeURIComponent(paramName).replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
}
Run Code Online (Sandbox Code Playgroud)


小智 5

window.location.search.slice(1).split('&').reduce((res, val) => ({...res, [val.split('=')[0]]: val.split('=')[1]}), {})
Run Code Online (Sandbox Code Playgroud)