How to get the value from the GET parameters?
我有一个带有一些get参数的URL,如下所示:
1 | www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 |
我需要得到EDOCX1的全部价值。我试着读网址,但只得到了
javascript本身没有用于处理查询字符串参数的内置功能。
在(现代)浏览器中运行的代码可以使用
1 2 3 4 | 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或此答案的原始版本中早于
您可以访问
然后你可以用这个来解析它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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获取查询字符串:
1 2 | var query = window.location.search.substring(1); var qs = parse_query_string(query); |
我看到过的大多数实现都忽略了URL对名称和值的解码。
下面是一个通用的实用程序函数,它还可以进行正确的URL解码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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); |
来源
1 2 3 4 5 6 7 8 9 | 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') |
这是只检查一个参数的简单方法:
示例URL:
1 | http://myserver/action?myParam=2 |
示例javascript:
1 | var myParam = location.search.split('myParam=')[1] |
如果URL中存在"myparam"…变量myparam将包含"2",否则将未定义。
也许您需要一个默认值,在这种情况下:
1 | var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue'; |
更新:这更有效:
1 2 3 | 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中充满了参数,它也能正常工作。
浏览器供应商已经实现了一种通过URL和urlSearchParams实现这一点的本地方法。
1 2 3 | 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/urlsearchparamshttps://developer.mozilla.org/en-us/docs/web/api/url/url
https://url.spec.whatwg.org网站/
谷歌工程师EricBidelman建议在不支持的浏览器中使用这种polyfill。
我早就发现了,很容易:
1 2 3 4 5 6 7 8 | function getUrlVars() { var vars = {}; var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars; } |
然后这样称呼它:
1 | var fType = getUrlVars()["type"]; |
您可以在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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; |
我写了一个更简单和优雅的解决方案。
1 2 | var arr = document.URL.match(/room=([0-9]+)/) var room = arr[1]; |
这里有一个递归的解决方案,它没有regex,并且有最小的突变(只有params对象是突变的,我认为这在JS中是不可避免的)。
太棒了,因为它:
- 是递归的
- 处理多个同名参数
- 处理格式错误的参数字符串(缺少值等)
- 如果值中有"=",则不中断
- 执行URL解码
- 最后一点,太棒了,因为…啊!!!!
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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']; |
看到这个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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"; } } |
使用URLSearchParams的超简单方法。
1 2 3 | function getParam(param){ return new URLSearchParams(window.location.search).get(param); } |
它目前在Chrome、Firefox、Safari、Edge等软件中得到了支持。
我做了一个这样的函数:
1 2 3 4 5 6 7 8 9 10 | 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; }; |
更新5/26/2017,这里是ES7实现(使用Babel预设阶段0、1、2或3运行):
1 2 3 4 | const getUrlParams = url => `${url}?`.split('?')[1] .split('&').reduce((params, pair) => ((key, val) => key ? {...params, [key]: val} : params) (...`${pair}=`.split('=').map(decodeURIComponent)), {}); |
一些测试:
1 2 3 4 5 | 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 {} |
更新3/26/2018,这里是一个类型脚本实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 }, {} ) |
更新2/13/2019,这里是一个与typescript 3一起工作的更新的typescript实现。
1 2 3 4 5 6 7 8 9 10 | 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, {}) |
ECMAScript 6解决方案:
1 2 3 4 5 | var params = window.location.search .substring(1) .split("&") .map(v => v.split("=")) .reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map()) |
我使用parseuri库。它可以让你完全按照自己的要求去做:
1 2 3 | 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' |
我用
1 2 3 4 | function getVal(str) { var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)')); return v ? v[1] : null; } |
这是我的解决方案。正如安迪E在回答这个问题时所建议的那样,如果反复构建各种regex字符串、运行循环等只是为了得到一个值,那么对脚本的性能就没有好处。所以,我想出了一个简单的脚本,返回单个对象中的所有get参数。您应该只调用一次,将结果赋给一个变量,然后在将来的任何时候,使用适当的键从该变量中获取您想要的任何值。请注意,它还负责URI解码(如%20),并将+替换为空格:
1 2 3 4 5 6 7 8 9 10 11 | 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; } |
下面是对脚本的一些测试,供您查看:
1 2 3 4 5 6 7 8 9 10 11 12 | // 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". |
对于像index.html这样的单个参数值?msg=1使用以下代码,
1 2 3 4 5 6 7 8 9 10 11 12 13 | $(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]; } |
对于所有参数值,使用以下代码,
1 2 3 4 5 6 7 8 9 10 11 12 13 | $(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 } } |
这里我发布了一个例子。但它在jquery中。希望它能帮助别人:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <script type="text/javascript" src="jquery.js"> <script type="text/javascript" src="jquery.url.js"> <!-- 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" }); |
这个问题的答案太多,所以我要添加另一个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * 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]; }, []); } |
用途:
1 2 | getURIParameter("id") // returns the last id or null if not present getURIParameter("id", true) // returns an array of all ids |
这可以处理空参数(那些不带
或者,如果您不想重新创建URI解析轮子,请使用uri.js
要获取名为foo的参数的值,请执行以下操作:
1 | new URI((''+document.location)).search(true).foo |
它的作用是
这是一把小提琴……http://jsfiddle.net/m6tett01/12/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 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"]; |
从这里获取:http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-with-jquery.html
简单方法
1 2 3 4 5 6 7 8 9 | function getParams(url){ var regex = /[?&]([^=#]+)=([^&#]*)/g, params = {}, match; while(match = regex.exec(url)) { params[match[1]] = match[2]; } return params; } |
然后像getparams(url)一样调用它
最短路线:
1 | new URL(location.href).searchParams.get("my_key"); |
还有一个建议。
已经有了一些很好的答案,但我发现它们不必要地复杂和难以理解。这是一个简短、简单的数组,返回一个简单的关联数组,其中键名与URL中的标记名相对应。
我在下面为那些想学习的人添加了一个带有评论的版本。
注意,它的循环依赖于jquery($.each),我建议不要使用for each。我发现使用jquery来确保跨浏览器的兼容性比插入单独的补丁来支持旧浏览器不支持的新功能更简单。
编辑:在我写下这篇文章之后,我注意到埃里克·埃利奥特的回答,虽然它使用了foreach,但几乎是相同的,而我通常反对(出于上述原因)。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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; } |
注释版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 } |
对于下面的示例,我们将假定此地址:
1 | http://www.example.com/page.htm?id=4&name=murray |
您可以将URL标记分配给自己的变量:
1 | var tokens = getTokens(); |
然后按如下名称引用每个URL令牌:
1 | document.write( tokens['id'] ); |
这将打印"4"。
您也可以直接从函数中引用一个令牌名称:
1 | document.write( getTokens()['name'] ); |
…上面印着"默里"。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // http:localhost:8080/path?param_1=a¶m_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" |
我需要读取一个url get变量并根据url参数完成一个操作。我到处寻找解决方案,发现了这段代码。它基本上读取当前页面的URL,对URL执行一些正则表达式,然后将URL参数保存在一个关联数组中,我们可以很容易地访问它。
所以作为一个例子,如果我们有下面的URL,并且javascript位于底部。
1 | http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July |
获取参数id和page所需要做的就是调用:
代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <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; } |
以下是用于将URL查询参数解析为对象的AngularJS源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | function tryDecodeURIComponent(value) { try { return decodeURIComponent(value); } catch (e) { // Ignore any invalid uri component } } function isDefined(value) {return typeof value !== 'undefined';} function parseKeyValue(keyValue) { keyValue = keyValue.replace(/^\?/, ''); var obj = {}, key_value, key; var iter = (keyValue ||"").split('&'); for (var i=0; i<iter.length; i++) { var kValue = iter[i]; if (kValue) { key_value = kValue.replace(/\+/g,'%20').split('='); key = tryDecodeURIComponent(key_value[0]); if (isDefined(key)) { var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true; if (!hasOwnProperty.call(obj, key)) { obj[key] = val; } else if (isArray(obj[key])) { obj[key].push(val); } else { obj[key] = [obj[key],val]; } } } }; return obj; } alert(JSON.stringify(parseKeyValue('?a=1&b=3&c=m2-m3-m4-m5'))); |
您可以将此函数添加到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | window.location.query = function query(arg){ q = parseKeyValue(this.search); if (!isDefined(arg)) { return q; } if (q.hasOwnProperty(arg)) { return q[arg]; } else { return""; } } // assuming you have this url : // http://www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 console.log(window.location.query()) // Object {a:"1", b:"3", c:"m2-m3-m4-m5"} console.log(window.location.query('c')) //"m2-m3-m4-m5" |
EldonMcGuiness的这一要点是迄今为止我所见过的最完整的JavaScript查询字符串解析器实现。
不幸的是,它是作为jquery插件编写的。
我把它改写为Vanilla JS并做了一些改进:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 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")); |
另见这把小提琴。
我要做的是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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; } |
1 | window.location.href.split("?") |
然后忽略第一个索引
1 | Array.prototype.slice.call(window.location.href.split("?"), 1) |
返回URL参数数组
1 2 | var paramArray = Array.prototype.slice.call(window.location.href.split(/[?=]+/), 1); var paramObject = paramArray.reduce(function(x, y, i, a){ (i%2==0) ? (x[y] = a[i+1]) : void 0; return x; }, {}); |
更详细/更具攻击性,但也更具功能性,paramobject包含所有映射为JS对象的参数。
我们可以在不循环所有参数的情况下以更简单的方式获取C参数值,请参见下面的jquery以获取参数。
1。要获取参数值:
1 2 3 | var url ="www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; url.match(**/(c=)[0-9A-Za-z-]+/ig**)[0].replace('c=',"") |
(或)
1 | url.match(**/(c=)[0-z-]+/ig**)[0].replace('c=',"") |
以字符串形式返回
"m2-m3-m4-m5"
2。要替换参数值:
1 2 3 | var url ="www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; url.replace(**/(c=)[0-9A-Za-z-]+/ig,"c=m2345"**) |
1 2 3 4 5 6 7 8 | function getParamValue(param) { var urlParamString = location.search.split(param +"="); if (urlParamString.length <= 1) return""; else { var tmp = urlParamString[1].split("&"); return tmp[0]; } } |
不管参数是最后一个还是最后一个,这都适用于您的案例。
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | // Handles also array params well function parseQueryString(query) { var pars = (query != null ? query :"").replace(/&+/g,"&").split('&'), par, key, val, re = /^([\w]+)\[(.*)\]/i, ra, ks, ki, i = 0, params = {}; while ((par = pars.shift()) && (par = par.split('=', 2))) { key = decodeURIComponent(par[0]); // prevent param value going to be"undefined" as string val = decodeURIComponent(par[1] ||"").replace(/\+/g,""); // check array params if (ra = re.exec(key)) { ks = ra[1]; // init array param if (!(ks in params)) { params[ks] = {}; } // set int key ki = (ra[2] !="") ? ra[2] : i++; // set array param params[ks][ki] = val; // go on.. continue; } // set param params[key] = val; } return params; } var query = 'foo=1&bar=The+bar!%20&arr[]=a0&arr[]=a1&arr[s]=as&isset&arr[]=last'; var params = parseQueryString(query); console.log(params) console.log(params.foo) // 1 console.log(params.bar) // The bar! console.log(params.arr[0]) // a0 console.log(params.arr[1]) // a1 console.log(params.arr.s) // as console.log(params.arr.none) // undefined console.log("isset" in params) // true like: isset($_GET['isset']) /* // in php parse_str('foo=1&bar=The+bar!%20&arr[]=a0&arr[]=a1&arr[s]=as&isset&arr[]=last', $query); print_r($query); Array ( [foo] => 1 [bar] => The bar! [arr] => Array ( [0] => a0 [1] => a1 [s] => as [2] => last ) [isset] => )*/ |
使用Dojo。这里没有其他的解决方案是这个短的或经过测试的:
1 2 3 4 5 6 | require(["dojo/io-query"], function(ioQuery){ var uri ="www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; var query = uri.substring(uri.indexOf("?") + 1, uri.length); var queryObject = ioQuery.queryToObject(query); console.log(queryObject.c); //prints m2-m3-m4-m5 }); |
您可以添加一个输入框,然后要求用户将值复制到其中…这样做非常简单:
1 2 3 4 5 6 | Hey User! Can you please copy the value out of the location bar where it says like, &m=2? Thanks! And then, if you could...paste it in the box below and click the Done button? <input type='text' id='the-url-value' /> <input type='button' value='This is the Done button. Click here after you do all that other stuff I wrote.' /> //...read the value on click |
好吧,说真的……我发现了这段代码,它看起来很好用:
1 2 3 4 5 6 7 8 9 10 11 12 13 | function queryToJSON() { var pairs = location.search.slice(1).split('&'); var result = {}; pairs.forEach(function(pair) { pair = pair.split('='); result[pair[0]] = decodeURIComponent(pair[1] || ''); }); return JSON.parse(JSON.stringify(result)); } var query = queryToJSON(); |
我喜欢尽可能地写速记:
网址:example.com/mortgageu calc.htm?PMTS=120&intr=6.8&prin=10000
普通JavaScript:
1 2 3 | for ( var vObj = {}, i=0, vArr = window.location.search.substring(1).split('&'); i < vArr.length; v = vArr[i++].split('='), vObj[v[0]] = v[1] ){} // vObj = {pmts:"120", intr:"6.8", prin:"10000"} |
从许多答案中学习(如Vamoose、Gnarf或Blixt)。
您可以创建一个对象(或使用location对象)并添加一个方法,该方法允许您获取URL参数、解码和JS样式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | Url = { params: undefined, get get(){ if(!this.params){ var vars = {}; if(url.length!==0) url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value){ key=decodeURIComponent(key); if(typeof vars[key]==="undefined") { vars[key]= decodeURIComponent(value); } else { vars[key]= [].concat(vars[key], decodeURIComponent(value)); } }); this.params = vars; } return this.params; } }; |
这允许只使用
它第一次从URL获取对象时,下一次将加载保存的对象。
例子在类似于
1 2 | Url.get.param1 //["param1Value","param1Value2"] Url.get.param2 //"param2Value" |
将window.location中搜索对象的所有url参数提取为json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | export const getURLParams = location => { const searchParams = new URLSearchParams(location.search) const params = {} for (let key of searchParams.keys()) { params[key] = searchParams.get(key) } return params } console.log(getURLParams({ search: '?query=someting&anotherquery=anotherthing' })) // --> {query:"someting", anotherquery:"anotherthing"} |
这里有一个解决方案,我发现它更易读一些,但它需要一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var getParams = function () { var params = {}; if (location.search) { var parts = location.search.slice(1).split('&'); parts.forEach(function (part) { var pair = part.split('='); pair[0] = decodeURIComponent(pair[0]); pair[1] = decodeURIComponent(pair[1]); params[pair[0]] = (pair[1] !== 'undefined') ? pair[1] : true; }); } return params; } |
我开发了一个Javascript工具,只需一个简单的步骤就可以做到这一点。
首先,将此脚本链接复制到HTML的头部:
1 | <script src="https://booligoosh.github.io/urlParams/urlParams.js"> |
然后用
您可以在这里看到使用您的值的真实演示。
还要记住,我确实开发了这个,但这是一个简单和无忧无虑的解决方案,您的问题。这个工具还包括十六进制字符解码,这通常是有帮助的。
这是我的解决方案:jfiddle
下面的方法返回一个字典,其中包含给定URL的参数。如果没有参数,则为空。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | function getParams(url){ var paramsStart = url.indexOf('?'); var params = null; //no params available if(paramsStart != -1){ var paramsString = url.substring(url.indexOf('?') + 1, url.length); //only '?' available if(paramsString !=""){ var paramsPairs = paramsString.split('&'); //preparing params = {}; var empty = true; var index = 0; var key =""; var val =""; for(i = 0, len = paramsPairs.length; i < len; i++){ index = paramsPairs[i].indexOf('='); //if assignment symbol found if(index != -1){ key = paramsPairs[i].substring(0, index); val = paramsPairs[i].substring(index + 1, paramsPairs[i].length); if(key !="" && val !=""){ //extend here for decoding, integer parsing, whatever... params[key] = val; if(empty){ empty = false; } } } } if(empty){ params = null; } } } return params; } |
你可以运行这个函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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; } var source = getUrlVars()["lm_supplier"]; var el = source.toString(); var result= decodeURI(el); console.log(result) |
此函数从URL获取所需内容,var source=geturlvars()["从url中得到什么"];
1 2 3 4 5 6 7 8 | function gup() { var qs = document.location.search; qs = qs.split('+').join(' '); var params = {}, tokens, re = /[?&]?([^=]+)=([^&]*)/g; while (tokens = re.exec(qs)) params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); return params; } |
像它一样使用它
1 | var params = gup() |
然后
1 2 | params.param1 params.param2 |
在我的示例中(重定向到具有所有子URL的新域)::
1 | window.location.replace("https://newdomain.com" + window.location.pathname); |
1 2 3 4 5 | $_GET: function (param) { var regex = new RegExp("(?:[?&]+" + param +"=)([^&]*)?","i"); var match = regex.exec(window.location.href); return match === null ? match : match[1]; } |
这工作:
1 2 3 | function getURLParameter(name) { return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [null, ''])[1].replace(/\+/g, '%20')) || null; } |
我没有得到任何其他工作的最佳答案。
我更喜欢使用可用的资源,而不是重新设计如何解析这些参数。
1 2 3 4 5 | const url = 'http://www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5'; const params = [... new URL(url).searchParams.entries()] .reduce((a, c) => Object.assign(a, {[c[0]]:c[1]}), {}) console.log(params); |
如最新浏览器中的第一个答案所述,我们可以使用新的URL API,但是,一个更一致的本机javascript轻松解决方案可以获取对象中的所有参数并使用它们
例如,这个类称为1 2 3 4 5 6 7 8 9 10 11 12 13 14 | const locationSearch = () => window.location.search; const getParams = () => { const usefulSearch = locationSearch().replace('?', ''); const params = {}; usefulSearch.split('&').map(p => { const searchParam = p.split('='); const [key, value] = searchParam; params[key] = value; return params; }); return params; }; export const searchParams = getParams(); |
用法::现在可以导入类中的searchparams对象
例如url---
1 2 3 4 5 6 7 | import { searchParams } from '../somewhere/locationUtil'; const {key1, valid} = searchParams; if(valid) { console.log("Do Something"); window.location.href = key1; } |
您可以简单地使用核心javascript获取参数的键值作为JS对象:
1 2 3 4 5 6 7 | var url_string ="http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; var url = new URL(url_string); let obj = {}; var c = url.searchParams.forEach((value, key) => { obj[key] = value; }); console.log(obj); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function parseUrl(url){ let urlParam = url.split("?")[1]; console.log("---------> URL param :" + urlParam); urlParam = urlParam.split("&"); let urlParamObject = {}; for(let i=0;i < urlParam.length;i++){ let tmp = urlParam[i].split("="); urlParamObject[tmp[0]] = tmp[1]; } return urlParamObject; } let param = parseUrl(url); param.a // output 10 param.b // output 20 |
我尝试了很多不同的方法,但当我在一个URL中查找参数值时,这个尝试过的真正regex函数对我有用,希望这有助于:
1 2 3 4 5 6 7 8 | var text = 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5' function QueryString(item, text){ var foundString = text.match(new RegExp("[\?\&]" + item +"=([^\&]*)(\&?)","i")); return foundString ? foundString[1] : foundString; } console.log(QueryString('c', text)); |
像
m2-m3-m4-m5
我一次又一次地遇到同样的问题。现在这里有很多用户,我以我的hax工作而出名,
所以我用以下方法来解决它:
PHP:
1 2 | echo"<p style="display:none" id="hidden-GET">".$_GET['id']." </p>"; |
JS:
1 | document.getElementById("hidden-GET").innerHTML; |
简单的哈克斯但工作。