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

IT技术 javascript url url-parameters
2021-01-02 23:57:35

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

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

我需要获得c. 我试图阅读 URL,但我只得到了m2. 我如何使用 JavaScript 做到这一点?

6个回答

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);


对于较旧的浏览器(包括 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);

您可以使用以下命令从当前页面的 URL 获取查询字符串:

var query = window.location.search.substring(1);
var qs = parse_query_string(query);
parse_query_string函数对 进行双重解码value=通过@ManelClos发出提到可以通过添加第二参数来解决2limit)到vars[i].split()
2021-02-12 23:57:35
对于包含 '=' 的值,parse_query_string 将失败,例如将 base64 编码的值作为值传递时。下面使用正则表达式的版本效果更好。
2021-02-25 23:57:35
@Jamland — 绝对不要那样做。它会破坏事物。这是一个现场演示, new URL()期望接收正确编码的 URL 作为其参数。decodeURIComponent期望传递URL 的一个组成部分,而不是整个 URL。
2021-03-02 23:57:35
@Quentin 我检查了不同的特殊字符,我认为你是对的。decodeURIComponent在这种情况下不应该使用
2021-03-03 23:57:35
对于较旧的浏览器,除了forURL之外,您可能还需要一个polyfillURLSearchParams或者您可以通过将var c = url.searchParams.get("c");上面答案中的行替换为var c = new URLSearchParams(window.location.search).get("c");.
2021-03-05 23:57:35

我见过的大多数实现都错过了对名称和值进行 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);
@Harvey 大小写不敏感不是查询参数的问题。这听起来像是一个特定于应用程序的东西,应该与查询参数提取一起应用,或者在查询参数提取之上应用。
2021-02-07 23:57:35
为什么qs.split('+').join(' ');qs.replace(/\+/g, ' ');
2021-02-09 23:57:35
@maxhawkins:它在某些浏览器中有效,而在其他浏览器中会进入无限循环。在这方面你说对了一半。我会将代码修复为跨浏览器。感谢您指出了这一点!
2021-02-10 23:57:35
此代码不起作用。它创建了一个无限循环,因为正则表达式是在循环定义中编译的,它会重置当前索引。如果将正则表达式放入循环外的变量中,它可以正常工作。
2021-02-17 23:57:35
@ZiTAL 此函数用于 URL 的查询部分,而不是整个 URL。请参阅下面注释掉的用法示例。
2021-03-08 23:57:35

来源

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')
看起来您有一些额外的转义字符。“\\[“ 应该 ”\[”。由于这些是常规字符串,因此 [ 和 ] 不需要转义。
2021-02-16 23:57:35
警报(gup('用户ID',window.location.href));
2021-02-21 23:57:35
这不是不区分大小写的。我应该在哪里添加“i”以使其不区分大小写?
2021-02-26 23:57:35
我最喜欢这个选项,但更喜欢返回 null 或结果,而不是空字符串。
2021-02-28 23:57:35
如果 URL 中没有参数,则结果将为 Null 并生成错误。在尝试解析数组之前测试 null 可能会更好
2021-03-02 23:57:35

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

示例网址:

http://myserver/action?myParam=2

示例 JavaScript:

var myParam = location.search.split('myParam=')[1]

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

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

var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue';

更新:这效果更好:

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';

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

您可能需要解码该值 result = decodeURIComponent(result);
2021-02-06 23:57:35
(location.search.split('myParam=')[1]||'').split('&')[0]- 与多个参数一起使用可能丢失 myParam
2021-02-16 23:57:35
这仅在您抓取的参数是 URL 中的最后一个时才有效,您不应该依赖它(即使您只需要一个参数)。例如http://myserver/action?myParam=2&anotherParam=3会产生 not "2"but "2&anotherParam=3"
2021-02-25 23:57:35
或者 location.search.split('myParam=').splice(1).join('').split('&')[0]
2021-02-25 23:57:35
您可以获得更高的精度并通过[?|&][?|&]myParam=([^&]+)
2021-03-05 23:57:35

浏览器供应商已经通过 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"

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

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URL/URL

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

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

更新了答案。我的原始答案没有正确使用 URLSearchParams,因为它仅设计用于处理 URL 的查询字符串部分。
2021-02-12 23:57:35
使用url.searchParams代替new URLSearchParams(url.search)
2021-02-17 23:57:35
@Markouver 难道不是 polyfill 负责吗?顺便说一句,Safari 是现代的 IE6
2021-02-23 23:57:35
为什么要new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')回来null找我?(在 Chrome 稳定版上)。b并且c似乎运作良好。
2021-02-28 23:57:35
根据 MDN 链接,Safari 支持 URL 但不支持 URLSearchParams。
2021-03-03 23:57:35