js正则表达式任意字符_js切割字符串_串是字符的有限序列

✦ ✦ ✦ ✦ ✦ ✦ ✦ ✦

你想从URL里获取参数? URL参数(也叫查询字符串参数获URL变量)可包含很多有用的数据,如产品信息、用户偏好、链接来源等等。

让我们开始吧!

1 获取URL参数

假设你有如下的url:

这里有个函数,它给你一个包含所有URL参数的简单对象:

(上下滑动看代码)

function getAllUrlParams(url) {

// 从url(可选)或window对象获取查询字符串

var queryString = url ? url.split(‘?’)[1] : window.location.search.slice(1);

// 我们把参数保存在这里

var obj = {};

// 如果查询字符串存在

if (queryString) {

// 查询字符串不包含#后面的部分,因此去掉它

queryString = queryString.split(‘#’)[0];

// 把查询字符串分割成各部分

var arr = queryString.split(‘&’);

for (var i=0; i

// 分离出key和value

var a = arr[i].split(‘=’);

// 考虑到这样的参数:list[]=thing1&list[]=thing2

var paramNum = undefined;

var paramName = a[0].replace(/[d*]/, function(v) {

paramNum = v.slice(1,-1);

return ”;

});

// 设置参数值(如果为空则设置为true)

var paramValue = typeof(a[1])===’undefined’ ? true : a[1];

// (可选)保持大小写一致

paramName = paramName.toLowerCase();

paramValue = paramValue.toLowerCase();

// 如果参数名已经存在

if (obj[paramName]) {

// 将值转成数组(如果还是字符串)

if (typeof obj[paramName] === ‘string’) {

obj[paramName] = [obj[paramName]];

}

// 如果没有指定数组索引

if (typeof paramNum === ‘undefined’) {

// 将值放到数组的末尾

obj[paramName].push(paramValue);

}

// 如果指定了数组索引

else {

// 将值放在索引位置

obj[paramName][paramNum] = paramValue;

}

}

// 如果参数名不存在则设置它

else {

obj[paramName] = paramValue;

}

}

}

return obj;

}

很快你会看到这是怎么工作的,但首先,这里有些用法示例:

getAllUrlParams().product; // ‘shirt’

getAllUrlParams().color; // ‘blue’

getAllUrlParams().newuser; // true

getAllUrlParams().nonexistent; // undefined

getAllUrlParams(‘http://test.com/?a=abc’).a; // ‘abc’

2 本函数使用须知

如果你只是想要一个可以放到你的代码里的函数,你已经完成了。如果你想了解这个函数是怎么工作的,继续看。

3 函数是如何工作的

总体来说,该函数接收一个URL的查询字符串(?之后#之前的部分),然后将数据提取到一个简洁对象里。

首先,这行代码的意思是,如果我们指定一个URL,则获取问号之后的所有内容js切割字符串,如果不指定的话,就用window对象的URL。

`var queryString = url ? url.split(‘?’)[1] : window.location.search.slice(1);`

接下来,我们将创建一个对象js切割字符串,用来保存我们的参数。

`var obj = {};`

如果查询字符串存在,我们则会解析它。首先我们必须确保去掉以#开头的部分,因为它不是查询字符串的一部分。

`queryString = queryString.split(‘#’)[0];`

现在我们可以把查询字符串分割成各组成部分。

`var arr = queryString.split(‘&’);`

这会给我们一个看起来像这样的数组:

`[‘product=shirt’, ‘color=blue’, ‘newuser’, ‘size=m’]`

接下来我们将遍历该数组并将每一项分隔成一个key和一个value,用来存放对象。

`var a = arr[i].split(‘=’);`

我们将需要处理像这样的重复参数或数组参数:

colors=red&colors=green&colors=blue

colors[]=red&colors[]=green&colors[]=blue

colors[0]=red&colors[2]=green&colors[5]=blue

为了处理重复和数组,我们首先把参数的索引号默认设置为undefined。然后我们把方括号内所有为零或者多个数字的参数名替换掉(如[]或[2]或[45])。在替换的同时,我们记录下是否存在相同的索引号。

var paramNum = undefined;

var paramName = a[0].replace(/[d*]/, function(v){

paramNum = v.slice(1,-1);

return ”;

});

现在我们要设置参数值了。如果没有值,我们就把它设置为true表示参数名存在。你可以根据应用场景自行修改。

`var paramValue = typeof(a[1])===’undefined’ ? true : a[1];`

根据需要,你可以设置所有参数名和值为小写字母。这样就可以避免出现当有人在url里发送example=TRUE而不是 example=true 时搞挂你的代码了(我经常碰到)。然而,如果你的查询字符串需要区分大小写,可以随意略过这部分:

paramName = paramName.toLowerCase();

paramValue = paramValue.toLowerCase();

如果在循环中这一步一个参数名已经存在,我们需要把值放进一个数组里,像这样:

(上下滑动看代码)

// if parameter name already exists

if (obj[paramName]) {

// convert value to array (if still string)

if (typeof obj[paramName] === ‘string’) {

obj[paramName] = [obj[paramName]];

}

// if no array index number specified…

if (typeof paramNum === ‘undefined’) {

// put the value on the end of the array

obj[paramName].push(paramValue);

}

// if array index number specified…

else {

// put the value at that index number

obj[paramName][paramNum] = paramValue;

}

}

如果参数名还不存在,我们就创建它并设置正确的值。

`obj[paramName] = paramValue;`

最后,我们返回这个带有参数和值的对象。

如果你的URL有经过编码的特殊字符例如空格(编码为%20),你也可以通过解码获取原来的值,像这样:

// assume a url parameter of test=a%20space

var original = getAllUrlParams().test; // ‘a%20space’

var decoded = decodeURIComponent(original); // ‘a space’

只是要小心不要解码已经解码过的字符,否则你会得到一个错误,尤其是包含百分号的时候。

不管怎样,恭喜你!现在你知道如何获取URL参数了,并且顺便学会了一些其他的技巧。

4 总结

本文的代码适用于需要获取URL参数的大部分常见情况。如果你需要处理任何边界情况,比如不常见的分隔符或特殊格式,那么确保经过测试并且做相应调整。

如果你想对URL做更多的事,这里有些特定的库,如jQuery URL 插件 和 Medialize URI.js。由于基本上都是字符串操作,使用纯JavaScript是合理的。无论你使用自己的代码还是库,确保检查一切以保证对你的用例有效。

✦ ✦ ✦ ✦ ✦ ✦ ✦ ✦

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688