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>
*/

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

相关推荐
会说法语的猪1 小时前
uniapp使用uni.navigateBack返回页面时携带参数到上个页面
前端·uni-app
古蓬莱掌管玉米的神9 小时前
vue3语法watch与watchEffect
前端·javascript
林涧泣9 小时前
【Uniapp-Vue3】uni-icons的安装和使用
前端·vue.js·uni-app
雾恋9 小时前
AI导航工具我开源了利用node爬取了几百条数据
前端·开源·github
拉一次撑死狗9 小时前
Vue基础(2)
前端·javascript·vue.js
祯民10 小时前
两年工作之余,我在清华大学出版社出版了一本 AI 应用书籍
前端·aigc
热情仔10 小时前
mock可视化&生成前端代码
前端
m0_7482463510 小时前
SpringBoot返回文件让前端下载的几种方式
前端·spring boot·后端
wjs040610 小时前
用css实现一个类似于elementUI中Loading组件有缺口的加载圆环
前端·css·elementui·css实现loading圆环
爱趣五科技10 小时前
无界云剪音频教程:提升视频质感
前端·音视频