如何parsing一个URL查询参数,在Javascript中?
可能重复:
在javascript中使用获取参数的url
在JavaScript中获取查询string值
在Javascript中,我怎样才能得到一个URLstring(不是当前的URL)的参数?
喜欢:
www.domain.com/?v=123&p=hello
我可以在JSON对象中获得“v”和“p”吗?
今天(这个答案后的2.5年),你可以安全地使用 Array.forEach
。 正如@ricosrealm所build议的那样,在这个函数中使用了decodeURIComponent
。
function getJsonFromUrl() { var query = location.search.substr(1); var result = {}; query.split("&").forEach(function(part) { var item = part.split("="); result[item[0]] = decodeURIComponent(item[1]); }); return result; }
其实并不是那么简单 ,在评论中看到同行评议,尤其是:
- 基于散列的路由(@cmfolio)
- 数组参数(@ user2368055)
- 正确使用decodeURIComponent(@AndrewF)
也许这应该去codereview SE,但这里是更安全和正则expression式的代码:
function getJsonFromUrl(hashBased) { var query; if(hashBased) { var pos = location.href.indexOf("?"); if(pos==-1) return []; query = location.href.substr(pos+1); } else { query = location.search.substr(1); } var result = {}; query.split("&").forEach(function(part) { if(!part) return; part = part.split("+").join(" "); // replace every + with space, regexp-free version var eq = part.indexOf("="); var key = eq>-1 ? part.substr(0,eq) : part; var val = eq>-1 ? decodeURIComponent(part.substr(eq+1)) : ""; var from = key.indexOf("["); if(from==-1) result[decodeURIComponent(key)] = val; else { var to = key.indexOf("]",from); var index = decodeURIComponent(key.substring(from+1,to)); key = decodeURIComponent(key.substring(0,from)); if(!result[key]) result[key] = []; if(!index) result[key].push(val); else result[key][index] = val; } }); return result; }
我也根据这篇文章replace了非编码的空格, 这也是遵循RFC 3986的编码方法。
注意result[key][index] = val
:创build一个新的数组项,它是可枚举的,所以它可以被forEach
调用迭代。 因此,你甚至可以parsingURL
var url = "?foo%20e[]=a%20a&foo+e[%5Bx%5D]=b&foo e[]=c"; // {"foo e": ["aa", "c", "[x]":"b"]} var obj = getJsonFromUrl(url)["foo e"]; for(var key in obj) { // Array.forEach would skip string keys here console.log(key,":",obj[key]); } /* 0 : aa 1 : c [x] : b */
你可以用这样的东西得到一个参数的JavaScript对象(地图):
var regex = /[?&]([^=#]+)=([^&#]*)/g, url = window.location.href, params = {}, match; while(match = regex.exec(url)) { params[match[1]] = match[2]; }
正则expression式很可能会得到改善。 它只是查找名称 – 值对,用=
分隔,而且它们自己用&
字符分隔(或者第一个字符为=
)。 就你的例子而言,以上将导致:
{v: "123", p: "hello"}
这是一个工作的例子 。
var v = window.location.getParameter('v'); var p = window.location.getParameter('p');
现在v和p分别是123和hello的对象