Regexp#exec
是安全的,儘管不是一個非常漂亮的界面。
邊注:如果你覺得這個功能吮吸,有一個更好的選擇,不要猶豫,分享:)
yeeep :-)
param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
這不使用a g
lobal正則表達式,因此您只替換每個括號的一個實例; field[][]
不起作用。你也不需要字符組... param.replace(/\[/g, '\\[')
會工作。或者,非正則表達式替換成語,param.split('[').join('\\[')
。
然後:
var regexS = "[\\?&]"+param+"=([^&#]*)";
你沒有逃跑近的字符足以能夠將它們拖放到一個正則表達式,並讓他們的意思是字面的自我。請參閱this question瞭解更多防水選擇。
無論如何,這種正則表達式仍然不是解析URL /查詢字符串的好方法。這與;
或%
-encoding或+
無法妥善處理,並且可能會在URL中其他地方的參數外觀上跳動。
取而代之,讓我們首先獲取查詢字符串。如果您有鏈接或位置對象,則可以從.search
屬性中獲取該對象。如果你只有一個字符串的URL,你可以把它變成一個鏈接對象可靠地得到這樣的:
function getQueryString(url) {
var a= document.createElement('a');
a.href= url;
return a.search;
}
現在,您可以通過刪除導致?
,分裂就&
或;
解析成,再滴加網址-decoded結果成JS對象:
function parseQuery(query) {
var lookup= {};
var params= query.slice(1).split(/[&;]/);
for (var i= 0; i<params.length; i++) {
var ix= params[i].indexOf('=');
if (ix!==-1) {
var name= decodeURIComponent(params[i].slice(0, ix));
var value= decodeURIComponent(params[i].slice(ix+1));
if (!(name in lookup))
lookup[name]= [];
lookup[name].push(value);
}
}
return lookup;
}
這使得它很容易查找參數:
var url= 'http://www.example.com/?a=b&c=d&c=%65;f[]=g#h=i';
var pars= parseQuery(getQueryString(url));
alert(pars.a); // ['b']
alert(pars.c); // ['d', 'e']
alert(pars['f[]']); // ['g']
alert('h' in pars); // false
如果你不需要要讀取參數的多個值,您只需執行lookup[name]= value
而不是if...[]...push
舞蹈,即可在查找中返回單個字符串值而不是列表。
'exec'調用不執行代碼。我不明白爲什麼這是不安全的。 – Amy
對我來說似乎是安全的,如果你不喜歡'.exec'只是改變它 – Ibu