在JS中获取URL中指定参数的值的方法有多种,但我觉得用正则表达式来获取要简洁方便的多。作为一只菜鸟猿,我在万能的网上找到了这样的代码:
var reg = new RegExp("(^|&)参数名称=([^&]*)(&|$)"); //正则表达式
var r = window.location.search.substr(1).match(reg); //window.location.search.substr(1)截取URL中?后面的部分
开心的把r当成匹配出的参数值结果去使用却不正确,原来r是一个数组。细看网上写的代码:
var reg = new RegExp("(^|&)参数名称=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
var 参数值 = unescape(r[2]);
unescape函数很好理解,是对URL进行解码。那么为什么参数值是取r[2]呢?这就涉及到JS中match函数的用法了,查了W3school的文档,有这样一句话:如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。这就很好理解了,我们的match匹配返回的r中第0个元素是匹配的文本,后面的元素是正则子表达式匹配的文本。那么为什么参数匹配出来是第2个元素呢?用以下代码测试:
var reg = new RegExp("(^|&)paramname=([^&]*)(&|$)");
var s="?paramname=paramValue";
var paramValue = s.substr(1).match(reg);
console.log(paramValue);
浏览器中打印出的结果如下:
可以看出,其实第1个元素对应的就是正则表达式里面第一个括号中的子表达式((^|&)paramname=([^&]*)(&|$))的匹配,第2个元素对应正则表达式中第二个括号中的子表达式((^|&)paramname=([^&]*)(&|$))的匹配,类推。所以,可见JS中match的第n位元素其实对应的是它匹配的正则表达式的第n个括号中的子表达式的匹配文本。
以上,记录,完。