我有一个带有GET参数的URL,如下所示:
www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5
我需要获取整个 c 的值。我尝试读取URL,但我只得到了 m2 。如何使用JavaScript实现这一点?
我有一个带有GET参数的URL,如下所示:
www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5
我需要获取整个 c 的值。我尝试读取URL,但我只得到了 m2 。如何使用JavaScript实现这一点?
JavaScript本身没有内置处理查询字符串参数的功能。
在(现代)浏览器中运行的代码可以使用 URL
对象(一个Web API)进行操作。 URL
也被Node.js实现:
// You can get url_string from window.location.href if you want to work with
// the URL of the current page
var url_string = "http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5";
var url = new URL(url_string);
var c = url.searchParams.get("c");
console.log(c);
对于旧版浏览器(包括Internet Explorer),您可以使用此polyfill。
您还可以使用URLSearchParams,并提取查询字符串以通过window.location.search.substring(1)
来传递。
您也可以使用先前版本的答案中的代码(早于URL
)。 上述polyfill非常强大且经过充分测试,因此我强烈建议使用它而不是使用这个方法。
您可以访问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.shift());
var value = decodeURIComponent(pair.join("="));
// If first entry with this name
if (typeof query_string[key] === "undefined") {
query_string[key] = value;
// If second entry with this name
} else if (typeof query_string[key] === "string") {
var arr = [query_string[key], value];
query_string[key] = arr;
// If third or later entry with this name
} else {
query_string[key].push(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);
URLSearchParams
添加 polyfill 之外,您可能还需要一个 polyfill for URL
。或者,您可以通过将上面答案中的行 var c = url.searchParams.get("c");
替换为 var c = new URLSearchParams(window.location.search).get("c");
来避免这个问题。 - evanrmurphylocalhost:
不是一个有效的 URL。http://localhost/path?query=something
是有效的。http://localhost:80/path?query=something
也是有效的。URL 对象可以很好地处理它们。 - Quentin我见过的大多数实现都忽略了对名称和值进行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);
qs.split('+').join(' ');
而不是qs.replace(/\+/g, ' ');
? - FlameStormfunction 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')
这是一个简单的方法来检查一个参数:
示例 URL:
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 充满参数,它也能正常工作。
myParam
的情况)(location.search.split('myParam =')[1] ||'').split('&') [0]
- Gábor Imrelocation.search.split('myParam=').splice(1).join('').split('&')[0]
- J.Steve[?|&]
,例如 [?|&]myParam=([^&]+)
,来获得更高的精度并允许任意顺序的参数。 - 1.21 gigawattsresult = decodeURIComponent(result);
- 1.21 gigawatts浏览器厂商已经通过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
new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')
在 Chrome 稳定版中返回 null
?似乎 b
和 c
的工作正常。 - ripper234url.searchParams
替代 new URLSearchParams(url.search)
。 - Caio Tarifa我很久以前就发现了这个,非常简单:
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,
function(m,key,value) {
vars[key] = value;
});
return vars;
}
然后像这样调用:
var fType = getUrlVars()["type"];
decodeURIComponent()
,因为这通常是您想要处理的内容;使用window.location.search
而不是window.location.href
,因为您只对参数感兴趣,而不是整个URL。 - LeifdecodeURIComponent(window.location.search).replace(/[?&]+([^=&]+)=([^&]*)/g, (m, key, value) => params[key] = value);
- Yaovar vars = {};
window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
即可解决问题。请注意,这里并没有修改原文的意思。 - Andres Ramos您可以通过 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;
?array[]=1&array[]=2
会产生 {"array[]": "2"}
的结果,显然是错误的。 - Kafoso使用 URLSearchParams 的超级简单方法。
function getParam(param){
return new URLSearchParams(window.location.search).get(param);
}
目前它在Chrome、Firefox、Safari、Edge和其他浏览器中得到支持。
我写了一个更简单、更优雅的解决方案。
var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];
noroom=1234
,这是不可取的。 - Izhar Aazmi这是一个递归的解决方案,没有正则表达式,并且只有最小限度的改变(仅参数对象被改变,我认为在JS中无法避免)。
它很棒,因为它:
代码:
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'];