不用迴圈純用正則實現從 url 中取參數的值。取代迴圈的核心技術是字串的 replace() 方法可以用函數作第二參數,按使用者定義的方式去替換。
//若有此參數名但無值,則返回Null 字元串;若無此參數名,返回 undefined。
//調用方法:var 變數名 = getparameter("要擷取的參數名", url地址)
var r = getparameter("age",url);
//測試輸出,結果是:site=popasp教程
alert(r);
//根據得到的結果可以使用
var pname = r.split("=")[0]; //擷取參數名
var pvalue = r.split("=")[1]; //擷取參數值
//測試輸出:
alert("參數名:" + pname + "nn" + "參數值:" + pvalue);
//其他實際應用:
//可以根據需要,配合以下方法實現自己要實現的功能;
//var hostname = location.hostname; //擷取當前網域名稱(不包含http://)
//var localurl = location.href; //擷取當前完整的url地址資訊(包含http://,網域名稱,路徑,具體檔案和全部傳遞參數)
//var referurl = document.referrer; //擷取上一頁完整的url資訊(包含http://,網域名稱,路徑,具體檔案和全部傳遞參數)
var getarg = function(argname)
{
var str = location.href;
var submatch;
//先從 url 中取出問號和井口與之間的查詢字串,如從 http://www.snowpeak.org/testjs.htm?a1=v1&a2=&a3=v3#anchor 中截出 a1=v1&a2=&a3=v3。
//問號是模式的特殊字元,所以要寫成 ?;井號可有可無,所以模式結尾是 #?
if (submatch = str.match(/?([^#]*)#?/))
{
//取到捕捉的子匹配形如 a1=v1&a2=&a3=v3,在前面加個 & 做成規則的 &a1=v1&a2=&a3=v3 便於下一步替換
var argstr = '&'+submatch[1];
//做個替換用的函數,把找到的每組形如 &a1=v1 替換成 a1:"v1", 這樣的對象定義用的屬性聲明
var returnpattern = function(str)
{
//$1 和 $2 代表捕捉到的第1個和第2個子匹配,必須用在字串裡
return str.replace(/&([^=]+)=([^&]*)/, '$1:"$2",');
}
//執行一個全域的正則替換,第二參數就是剛才定義的替換函數,把 a1=v1&a2=&a3=v3 替換成 a1:"v1",a2:"",a3:"v3",
argstr = argstr.replace(/&([^=]+)=([^&]*)/g, returnpattern);
//最後再執行一個對象的聲明,需要形如 var retvalue = {a1:"v1",a2:"",a3:"v3"}; 的對象聲明,而剛才替換完的字串結尾還有個逗號,把結尾的逗號用 substr 截掉即可
eval('var retvalue = {'+argstr.substr(0, argstr.length-1)+'};');
//現在就得到了一個對象,url 中每個參數名是其屬性名稱,參數值是對應的屬性值
return retvalue[argname];
}
}
//測試
document.write('a1='+getarg('a1')+', a2='+getarg('a2')+', a3='+getarg('a3'));
下面利用正則處理方法
function geturlparam(name) {
var reg = new regexp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null)
return unescape(r[2]);
return null;
}