Home » Code » 将URL参数转换成json对象

将URL参数转换成json对象

逛博客园看到这么一个题目,博主的做法觉得不错,拿来分享一下。

做法是使用正则匹配。他使用的正则表达式为:

/([^?&=]+)=([^?&=]*)/g

对于正则不是很熟悉的我一时看不懂,随即翻开手册看了一下。原来[^?&=]的意思即是匹配不是?、&、=这三者任意一个的任意一个字符,比如[^abc]可以匹配到china中的h,因为c是abc中的一个字符,h就不是了,匹配到即停止。这跟不要中括号^abc是两回事,^abc匹配的是以abc三个字符开头的abc这三个字符。这里为什么要匹配不是?、&、=这三个字符的字符呢?因为这三个字符是URL参数中的关键字,比如?a=1&b=2,我们要的是键a值1和键b值2,作为json对象的键值,只要不是这三个关键字,都是有效的。而有时候,URL中会出现只有键无值的情况,也就是值为空,这是有效的,而只有值无键则是无效的。因此,正则中左边使用的是+,右边使用的是*,这样可以避免无效的情况。完整代码如下:

function getQueryObject(queryStr) {
	var str = queryStr === undefined ? location.search : queryStr;
	var obj = {};
	var reg = /([^?&=]+)=([^?&=]*)/g;
	str.replace(reg, function(match, $1, $2) {
		var name = decodeURIComponent($1);
		var val = decodeURIComponent($2);
		obj[name] = val;
	});
	return obj;
}

这里还使用了replace这个方法。当第二个参数为函数时,函数第一个参数传递的是整个匹配到的字符串,如a=1。第二个参数是第一个括号匹配到的部分,如a,第三个参数是第二个括号匹配到的部分,如1。这样就足够了,每匹配到一个会调用一次,这样URL参数中如果有两个相同的键,后面的也会覆盖前面的,而这也正是我们需要的。

参考链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.