js关键字标红

TP:以下两种方法多次匹配也不会造成匹配结果混乱的问题

  1. 第一种方法
javascript 复制代码
let keyword = ["red", "color", ">"];
let tableData = {
  MatchCompanyName: "color fjkfffs red >",
};

// 关键词高亮函数
function highlightKeywords(data, keywords) {
  let matchCompanyName = data.MatchCompanyName;
  let result = '';
  let lastIndex = 0;

  // 构建一个正则表达式,将所有关键词合并到一个表达式中
  const regex = new RegExp(keywords.join('|'), 'gi');

  // 遍历所有的匹配项
  matchCompanyName.replace(regex, (match, index) => {
    // 拼接匹配前的部分
    result += matchCompanyName.slice(lastIndex, index);
    // 拼接高亮的部分
    result += `<span class="highlighted">${match}</span>`;
    // 更新最后一个匹配结束的索引
    lastIndex = index + match.length;
  });

  // 拼接剩余的部分
  result += matchCompanyName.slice(lastIndex);

  return result;
}

// 获取高亮后的结果
let highlightedText = highlightKeywords(tableData, keyword);

// 输出结果或更新 DOM
console.log(highlightedText);

// 在 HTML 中可以使用 "highlighted" 类进行样式设置
/*
<style>
  .highlighted {
    color: red;
  }
</style>
*/
  1. 第二种
javascript 复制代码
let keyword = ["red", "color", ">"];
let tableData = {
  MatchCompanyName: "color fjkfffs red >",
};

// 函数用于根据关键词高亮匹配项
function highlightKeywords(data, keywords) {
  let matchCompanyName = data.MatchCompanyName;
  let highlights = []; // 用于存储匹配的起始和结束位置

  // 查找每个关键词的匹配位置
  keywords.forEach((word) => {
    const regex = new RegExp(word, 'gi'); // 大小写不敏感匹配
    let match;
    while ((match = regex.exec(matchCompanyName)) !== null) {
      highlights.push({ start: match.index, end: regex.lastIndex });
    }
  });

  // 按照匹配的位置从后往前插入 <span>,避免位置错乱
  highlights.sort((a, b) => b.start - a.start);

  highlights.forEach((highlight) => {
    matchCompanyName =
      matchCompanyName.slice(0, highlight.start) +
      '<span class="highlighted">' +
      matchCompanyName.slice(highlight.start, highlight.end) +
      '</span>' +
      matchCompanyName.slice(highlight.end);
  });

  return matchCompanyName;
}

// 获取高亮后的结果
let highlightedText = highlightKeywords(tableData, keyword);

// 输出结果或更新 DOM
console.log(highlightedText);

// 在 HTML 中可以使用 "highlighted" 类进行样式设置
/*
<style>
  .highlighted {
    color: red;
  }
</style>
*/

总结:第一种方法通过一次遍历来找到所有的匹配项并构建新的字符串,避免在替换时频繁地操作字符串。这种方式减少了字符串的拼接操作,提高了性能。

相关推荐
bysking27 分钟前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
王哲晓43 分钟前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_4111 小时前
无网络安装ionic和运行
前端·npm
理想不理想v1 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云1 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
微信:137971205871 小时前
web端手机录音
前端
齐 飞1 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
神仙别闹1 小时前
基于tensorflow和flask的本地图片库web图片搜索引擎
前端·flask·tensorflow
aPurpleBerry2 小时前
JS常用数组方法 reduce filter find forEach
javascript
GIS程序媛—椰子2 小时前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js