使用正则表达式实现不区分大小写的高亮搜索

本文介绍了如何使用正则表达式在javascript中实现搜索时的高亮功能,特别是在Vue.js环境中。当搜索框内容变化时,通过正则匹配使元素匹配部分不区分大小写地高亮显示。设计方案包括在搜索状态下利用DOM操作和<span>元素实现高亮,并在重命名时恢复原始状态。主要方法是运用String.replace API进行全局和大小写敏感的正则替换,以避免split方法导致的大小写丢失问题。

需求:

搜索框输入变化时,匹配符合的元素匹配部分高亮。

 

背景:

元素名称为<input>,可以重命名。

 

设计方案:

搜索状态时,通过正则匹配,将<input>组件通过DOM操作,替换成<span>分割的字符,通过<span>的class实现高亮样式;在重命名时,显示回原来的<input>组件。

 

主要方法:

主要为正则匹配替换的方法。

 <div class="element-name-wraper" v-show="searchText === '' || isRenameMode">
                                  <input type="text" class="element-name scene-name"
                                      ref="elementNameInput"
                                      v-model.trim="element.name"
                                      :disabled="!isRenameMode"
                                      @blur="handleRenameEnter"
                                      @keyup.enter="handleRenameEnter"
                                      @keyup.esc="handleRenameCancel"
                                  >
</div>
<div class="element-name-wraper" ref="elementNameWraper" v-show="searchText !== '' && !isRenameMode">
</div>

    handleSearchMode: function(pattern) {
      if(pattern && pattern.length>0) {
        let name = this.element.name
        let reg = new RegExp(pattern, 'gi')
        name = name.replace(reg, match => {
          return '<span class="search-match">'+ match +'</span>'
        })
        this.$refs["elementNameWraper"].innerHTML = name
      }
    },

使用了String.replace的API,第一个参数为reg,'gi'保证了全局和大小写非敏感;第二个参数为function,参数为匹配结果。

 

其他:

一开始没有使用String.replace,而是使用了String.split(reg)。这样存在的问题在于,不能取得原字符串匹配相符的字段,替换时,只能使用pattern,这样会把原先的大写字符在高亮时显示成小写字符。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值