用正则表达式获取URL中的查询参数

总结获取url中查询参数的两种方式正则表达式

经过正则表达式获取单个参数

url中的全部查询参数能够经过 window.location.search 字段获取,以字符串的形式返回。并有固定的格式 ?param1=value1&param2=value2···,因此能够正则表达式匹配。ide

分析下须要匹配的格式:函数

  • param=value, 其中须要获取的是value部分,可是也须要 param= 参与匹配,可是不能参与返回结果,这里有先后查找的问题
  • ?param=value&param=value 均可能存在,参数名称紧跟在?&以后;还要注意的是,要区分 emalimail 这种名称,/mail/既能匹配到email又能匹配mail,因此要给参数名称加一个边界,名称的上一个字符要是一个非单词(\W)的字符,这样就能够解决这两个问题
  • value后多是空,也多是下一组参数(以&分割),因此value的值要匹配到[^&]为止
  • 因为参数名称是变化的,因此须要用字符串的形式来生成正则表达式

先后查找和边界的介绍能够细看MDN中的详细介绍。工具

搞定正则以后,使用string的match方法,就能直接获取到对应的参数值ui

function getUrlParamsByName(name) {
    // \b 边界   
    // ?<= 向后匹配 
    // 字符串转成正则表达式,其中的'\b'类型的特殊字符要多加一个'\'
    let reg = new RegExp(`(?<=\\b${name}=)[^&]*`),
    str = location.search || '',
    target = str.match(reg);
    
    if(target) {
        return target[0]
    }

    return;
}

解析全部参数,以对象返回

上一个方法是获取单个的参数值,此方法是为了解析出全部的参数url

利用string的一些工具函数取值,注意一些异常场景的判断code

function getUrlParams() {
    let obj = {};

    if (!window) {
        return; 
    }

  let str = window.location.search || '';
  
  if (str && str.slice(1)) {
     // 去掉 ? ,而后以 & 分割
    let queryArray = str.slice(1).split('&');
    queryArray.map((query) => {
      // param=value 以 = 分割
      let temp = query.split('=');
      if(temp.length > 1) {
      // 收集参数
      obj[temp[0]] = temp[1];
      }
    })
  }

    return obj;
}

总结

正则表达式的方式更加灵活便捷啊,开始用的时候不习惯,后来以为真香!对象

相关文章
相关标签/搜索