我有一个带有一些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执行此操作?
当前回答
我做了一个函数来实现这一点:
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预设阶段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 3一起使用的更新的TypeScript实现。
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, {})
其他回答
我很早以前就发现了这一点,非常简单:
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,
function(m,key,value) {
vars[key] = value;
});
return vars;
}
然后这样称呼:
var fType = getUrlVars()["type"];
一个内衬和IE11友好:
> (window.location.href).match('c=([^&]*)')[1]
> "m2-m3-m4-m5"
JavaScript本身没有内置处理查询字符串参数的功能。
在(现代)浏览器中运行的代码可以使用URL对象(Web API)。URL也由Node.js实现:
//如果您想使用,可以从window.location.href获取url_string//当前页面的URLvar url_string=“http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5“;var url=新url(url_string);var c=url.searchParams.get(“c”);控制台日志(c);
对于较旧的浏览器(包括Internet Explorer),可以使用此polyfill。
您还可以对URLSearchParams使用一个,并提取查询字符串,以通过window.location.search.substring(1)传递给它。
您也可以使用URL之前的原始版本的代码。上面的polyfill是健壮的,经过了很好的测试,但我强烈建议使用它。
您可以访问location.search,这将从中提供给您?在URL末尾或片段标识符(#foo)的开头(以先到者为准)添加一个字符。
然后,您可以使用以下命令解析它:
函数parse_query_string(查询){var vars=查询.split(“&”);var query_string={};对于(var i=0;i<vars.length;i++){var pair=vars[i].split(“=”);var key=解码URIComponent(pair.shift());var value=decodeURIComponent(pair.join(“=”));//如果第一个条目具有此名称if(query_string[key]类型==“未定义”){query_string[key]=值;//如果第二个条目具有此名称}否则如果(query_string[key]类型==“string”){var arr=[query_string[key],value];query_string[key]=arr;//如果使用此名称的第三个或更高版本条目}其他{query_string[key].push(值);}}返回query_string;}var query_string=“a=1&b=3&c=m2-m3-m4-5”;var parsed_qs=parse_query_string(query_string);控制台日志(parsed_qs.c);
您可以通过以下方式从当前页面的URL获取查询字符串:
var query = window.location.search.substring(1);
var qs = parse_query_string(query);
这是有效的:
function getURLParameter(name) {
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [null, ''])[1].replace(/\+/g, '%20')) || null;
}
我没有得到任何其他最好的答案。
您可以在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;