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

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

相关推荐
FlyWIHTSKY27 分钟前
vue2和vue3有什么区别,用法上有哪些区别
前端·javascript·vue.js
码云之上29 分钟前
10 颗一模一样的「Edit」:中后台 Web Agent 怎么找到对的那一行
前端·人工智能·浏览器
量化分析码农1 小时前
【Python量化多因子实战 04】因子暴露不是 alpha:市值与行业中性化实战
前端·后端
不可能片场1 小时前
Electron 发布 正文写入的三条通道与读回口径
前端·electron
程序员大阳2 小时前
副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发
javascript·json·实战·待办事项·本地存储·案例
jerrywus2 小时前
让 AI 帮你部署 Vercel,报错了也不用手动搬日志
前端·agent·mcp
补码缩写2 小时前
11 行 Python 拆 PNG 块,解压后的字节数能手算
前端
coding漫漫长路2 小时前
PNG压缩先看图是哪一类,先无损再量化多半白做
前端
用户257680763212 小时前
搜「洗牙」为什么搜不到「洁治」
前端
费曼学习法2 小时前
Agent 死循环的根因不在模型:错误分类、退避、熔断、快照四层实现
前端