解析 URL 参数是一个常用的场景,一般有 2 种处理方式:① 正则获取;② split 自行处理;
本文写了 2 个常用的场景示例:① 获取所有参数;② 获取单个参数;
一. 获取所有参数的 <key, value> 对象
1. 正则方式
/**
* 获取当前 URL 所有 GET 查询参数
* 入参:要解析的 URL,不传则默认为当前 URL
* 返回:一个<key, value>参数对象
*/
function getUrlQueryParams(url = location.search){
const params = {};
const keys = url.match(/([^?&]+)(?==)/g);
const values = url.match(/(?<==)([^&]*)/g);
for(const index in keys){
params[keys[index]] = values[index];
}
return params;
}
([^?&]+)
意思是匹配非? 及 &
开头的非空字符串(?==)
意思是非获取匹配=
,正向肯定预查,以便获取不带等号结尾的 key 值([^&]*)
意思是匹配非? 及 &
结尾的字符串(包含空字符串情况,因为有的 value 值会为空)(?<==)
意思是非获取匹配=
,反向肯定预查,以便获取不带等号开头的 value 值- 注意:
IOS SyntaxError: Invalid regular expression: invalid group specifier name
在 iOS 上会不支持常用零宽断言?<=、?<!、?!、?=
因此上面的函数不适用 iOS,下面的方法可以
2. 正则 + split 方式
/**
* 获取当前 URL 所有 GET 查询参数
* 入参:要解析的 URL,不传则默认为当前 URL
* 返回:一个<key, value>参数对象
*/
function getUrlQueryParams(url = location.search){
const params = {};
const reg = /([^&?]*)=([^&]*)/g;
const res = url.match(reg);
for(const key in res){
const query = res[key].split('=');
params[query[0]] = query[1];
}
return params;
}
二. 获取单个 key 的参数
1. 正则方式
/**
* 获取当前 URL 单个 GET 查询参数
* 入参:要解析的 URL,不传则默认为当前 URL
* 返回:一个<key, value>参数对象
*/
function getUrlSingleParam(key, url = location.search){
const reg = new RegExp("(\\?|&)" + key + "=([^&]*)(&|$)");
const r = url.match(reg);
if (r != null) {
return unescape(r[2]);
}
return null;
}
(\\?|&)
意思是字符串中以?或&
开始的地方([^&]*)
意思是非&
的字符串(&|$)
意思是以&或$
结尾的字符串
2. split 方式
/**
* 获取当前 URL 单个 GET 查询参数
* 入参:要解析的 URL,不传则默认为当前 URL
* 返回:一个<key, value>参数对象
*/
function getUrlSingleParam(key, url = location.search){
var query = url.substring(1);
var vars = query.split("&");
for (var i=0; i<vars.length; i++) {
var pair = vars[i].split("=");
if(pair[0] == key){return pair[1];}
}
return null;
}