IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> JavaScript 使用 .replace(正则 函数) 获取地址参数妙不可言的用法 -> 正文阅读

[JavaScript知识库]JavaScript 使用 .replace(正则 函数) 获取地址参数妙不可言的用法

在阅读一段源码时,看到这么一段代码,可以获取到地址中所有的参数:

function getUrlVars(href) {
    var vars = {};
        var parts = href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (m, key, value) {
            vars[key] = value;
        });
        return vars;
}

这里重点要说的就是 replace 的第二个参数。我们一般用法是这样:

.replace("a", "b")

作用就是将 a 替换成 b。但是很少用到第二参为函数的情况,如开始的那段代码里,就使用了一个函数。要理解这个用法,我们需要掌握两个概念:

1. 正则表达式(很简单的用法,了解一下,别被吓跑)

1.1 分组

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

在这个正则中,有两组 ( ) 及中间的内容就是分组,我们可以将第一个 ([^=&]+) 也就是第一组匹配到的内容起个名字叫 key,第二组([^&]*)匹配到的内容起个名字叫 value,这样我们就能得到地址中想要的参数名和参数值。

2. replace() 的第二参函数是有默认参数的

我们可以给个带参数的地址试着打印,看看默认参数里有些什么内容:

function getUrlVars(href) {
    var vars = {};
    var parts = href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function() {
    	// arguments 就是默认参数
        console.log(arguments); 
    });
    return vars;
}
let _params = getUrlVars("https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json");
console.log(_params);

输出的结果:

[Arguments] {
  '0': '?q=js',
  '1': 'q',
  '2': 'js',
  '3': 26,
  '4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}
[Arguments] {
  '0': '&form=QBRE',
  '1': 'form',
  '2': 'QBRE',
  '3': 31,
  '4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}
[Arguments] {
  '0': '&sp=-1',
  '1': 'sp',
  '2': '-1',
  '3': 41,
  '4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}
[Arguments] {
  '0': '&pq=json',
  '1': 'pq',
  '2': 'json',
  '3': 47,
  '4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}

看到运行结果就一目了然了:

href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function())

执行 replace 时,正则的匹配其实就是一个 match 的过程,每匹配到一个结果,就会执行一次 function() 。

所以,我们提供的地址中有4个参数,也就执行了4次 function() ,将每次 function() 的默认参数打印出来就得到了上边的结果。

默认参数:

第一个是匹配到的值,第二个是分组一得到的内容,第二个是分组二得到的内容,第三个是正则匹配的位置索引,第四个是原字符串。

这里我们就要抓住机会,为默认参数命名,拿刚才打印的第一条内容来讲:

[Arguments] {
  '0': '?q=js',
  '1': 'q',
  '2': 'js',
  '3': 26,
  '4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}

function (m, key, value)

第一个参数命名为 m:得到 ?q=js 这个结果我们没用,但是作为占位,就随便起个名字。
第二个参数命名为 key:q 也就是第一个分组的到的内容,也就是地址参数名。
第二个参数命名为 value:js 是第二个分组得到的内容,也就是参数值。
后边的参数,我们用不到,就不用管了,空着就行。

最后:来个完整的用法

function getUrlVars(href) {
    var vars = {};
    var parts = href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) {
        vars[key] = value;
    });
    return vars;
}
let _params = getUrlVars("https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json");
console.log(_params);
// { q: 'js', form: 'QBRE', sp: '-1', pq: 'json' }
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:23:29  更:2022-05-12 16:23:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:42:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码