<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
廢話少說先上效果(左側程式碼,右側效果)
看到什麼規律了嗎?
沒錯!!這份程式碼就是依靠正規表示式來做出高亮效果,你負責傳入str與reg,而函數則負責實現程式碼的高亮
結構部分如下
<template> <div> <span :class="index%2!==0?'hightLight':''" v-for="(item,index) in textData" :key="index" >{{item}}</span> </div> </template>
基本原理就是將傳入的str按照正則的規則進行切割,偶數部分負責高亮,奇數部分負責正常顯示
如:
str與reg分別為
let str = "高亮幾個詞語出來好不好"; let reg = /(高亮|詞語)/g;
將該部分切割為如下陣列
"高亮幾個詞語出來好不好" ---》 ['', '高亮', '幾個', '詞語', '出來好不好'] ----》
知道了基本原理,我們再來看一下程式碼
let str = "高亮幾個詞語出來好不好"; let reg = /(高亮|詞語)/g; let result = {}; let currentIndex = 0, returnData = []; while ((result = reg.exec(str))) { returnData.push(str.slice(currentIndex, result.index)); returnData.push(result[1]); currentIndex = result.index + result[0].length; } if (str.length > currentIndex) { returnData.push(str.slice(currentIndex, str.length)); } console.log(returnData); this.textData = returnData;
程式碼關鍵在於理解reg.exec,瞭解這個api的可以直接跳到提取關鍵字並分組
理解了這個例子,也就基本理解了其他的例子
我們這樣規定,將被兩個#和一個空格包圍的內容進行高亮即## 內容 ##時,內容要被提取出來並高亮,首先要對其進行分組
"1212## 4455 #### 0011 ##44488## 000000 ##"就會被分為
['1212', '4455', '', '0011', '44488', '000000'] 高亮文字與普通文字間隔排序
先來看看下面這部分程式碼
let str = "1212## 4455 #### 0011 ##44488## 000000 ##"; let reg = /##s+(.*?)s+##/g; console.log(reg.exec(str)); console.log(reg.exec(str)); console.log(reg.exec(str)); console.log(reg.exec(str));
執行結果如下
也就是說,在null之後的執行結果,都是迴圈之前的執行結果,所以咱們在執行結果為null時即可停止
0: "## 4455 ##" 1: "4455" groups: undefined index: 4 input: "1212## 4455 #### 0011 ##44488## 000000 ##" length: 2
返回的是一個陣列,並帶有幾個欄位屬性
結合一下其正則'0'是拿匹配到正則規則的值,'1'則是匹配到在正則裡第一個被括號包起來的值
,這個lenth你可以粗糙的理解為需要提取的(即有幾個括號)數量+1(這個指的是能匹配到的整體)
至於為什麼是一樣的還要用括號括起來,這個後面會說
知道原理之後我們來看看如何提取關鍵字並分組
提取關鍵字並分組 首先我們清楚的看到,通過正則,他會給出三個有用的資訊
第一個是匹配到的正則規則中的值
第二個是可以拿到我們想要提取出來 即用括號括起來的值
第三個是該值所在的index
我們一步一步來
分成這種結構,
也就是每次exec執行不為null時都做一次區分, 將匹配到的值前方位置提取作為普通字串,再把當前的關鍵字提取作為高亮字串,如下:
比如第一次匹配時,拿到的值是這樣的
/* 0: "## 4455 ##" 1: "4455" groups: undefined index: 4 input: "1212## 4455 #### 0011 ##44488## 000000 ##" length: 2 */
這裡index為4,將下標為0-4的字元提取為普通陣列,而匹配到的字串4455作為高亮字元
此時陣列為['1212','4455']
0: "## 0011 ##" 1: "0011" groups: undefined index: 14 input: "1212## 4455 #### 0011 ##44488## 000000 ##" length: 2
普通字串應下標為為14-14即空字串,高亮字元為匹配到的0011
此時陣列為['','0011']
這裡需要明確兩個14分別是怎麼來的
第一個14是上一次匹配返回值的 index+上次匹配到字串字串## 4455 ##的長度
第二個14是本次配到的index,
可能這時還有點懵,看這最後一次匹配,你應該就理解了
0: "## 000000 ##" 1: "000000" groups: undefined index: 29 input: "1212## 4455 #### 0011 ##44488## 000000 ##" length: 2
普通字串應是下標為24-29即44488,高亮字元為000000
此時陣列為['44488','000000']
同樣需要明確24,29分別是怎麼來的
第一個是上一次匹配返回值的 index+上次匹配到字串### 0011 ##的長度
第二個則是本次匹配到的index 29
至此 我們用一個while迴圈將其包裹,利用上面的規則把對應的值push到陣列中,並用一個值快取上一次的index就可以得到我們的目標陣列
let str = "1212## 4455 #### 0011 ##44488## 000000 ##"; let reg = /##s+(.*?)s+##/g; let result = {}; let currentIndex = 0, returnData = []; while ((result = reg.exec(str))) { console.log(result); returnData.push(str.slice(currentIndex, result.index)); returnData.push(result[1]); currentIndex = result.index + result[0].length; } // 最後一次匹配的高亮詞後可能還有沒push到陣列中的值 if (str.length > currentIndex) { returnData.push(str.slice(currentIndex, str.length)); } console.log(returnData); // ['1212', '4455', '', '0011', '44488', '000000'] this.textData = returnData;
<template> <div> <span :class="index%2!==0?'hightLight':''" v-for="(item,index) in textData" :key="index" >{{item}}</span> </div> </template> <script> export default { data() { return {}; }, created() { this.init(); }, methods: { init() { // let str = "實現搜尋詞高亮 - 百度文庫"; // let reg = /([高亮詞文])/g; // let str = "高亮幾個詞語出來好不好"; // let reg = /(高亮|詞語)/g; let str = "1212## 4455 #### 0011 ##44488## 000000 ##"; let reg = /##s+(.*?)s+##/g; let result = {}; let currentIndex = 0, returnData = []; while ((result = reg.exec(str))) { console.log(result); returnData.push(str.slice(currentIndex, result.index)); returnData.push(result[1]); currentIndex = result.index + result[0].length; } if (str.length > currentIndex) { returnData.push(str.slice(currentIndex, str.length)); } console.log(returnData); this.textData = returnData; } } }; </script> <style> .hightLight { color: red; } </style>
以上就是vue實現搜尋關鍵詞高亮的詳細教學的詳細內容,更多關於vue搜尋關鍵詞高亮的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45