js高亮文本

JavaScript如果实现一段文字的高亮显示 阅读详情

高亮文本

const inputs = [
  "这是一个普通文本,包含关键字测试。",
  '<p style="font-size: 10px">这是一个<span>GVM</span> <strong>测试</strong>内容。</p>',
];

const keywords = ["测试", "GVM"];
function highlightKeyword(inputContent, keyword) {
  if (!keyword) return inputContent; // 如果没有关键字,直接返回原始内容

  // 转义用户输入的关键字,避免正则表达式特殊字符冲突
  const escapeRegExp = (str) =>
    str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");

  // 创建匹配关键字的正则表达式
  const keywordRegex = new RegExp(`(${escapeRegExp(keyword)})`, "gi");

  // 判断是否为普通文本(没有 HTML 标签)
  const isPlainText = !/<[^>]+>/.test(inputContent);

  if (isPlainText) {
    // 普通文本处理
    return inputContent.replace(
      keywordRegex,
      '<span class="highlight">$1</span>'
    );
  }

  // HTML 内容处理
  const parser = new DOMParser();
  const doc = parser.parseFromString(inputContent, "text/html");

  // 遍历节点,处理文本高亮
  function traverseNodes(node) {
    if (node.nodeType === Node.TEXT_NODE) {
      // 替换关键字为高亮的内容
      const parent = node.parentNode;
      const highlightedHTML = node.textContent.replace(
        keywordRegex,
        '<span class="highlight">$1</span>'
      );

      // 用安全的 HTML 替换
      if (highlightedHTML !== node.textContent) {
        const temp = document.createElement("div");
        temp.innerHTML = highlightedHTML;
        while (temp.firstChild) {
          parent.insertBefore(temp.firstChild, node);
        }
        parent.removeChild(node);
      }
    } else if (node.nodeType === Node.ELEMENT_NODE) {
      // 递归处理子节点
      Array.from(node.childNodes).forEach(traverseNodes);
    }
  }

  traverseNodes(doc.body);

  // 返回处理后的 HTML
  return doc.body.innerHTML;
}

跨标签命中

function highlightKeyword(inputContent, keyword) {
  if (!keyword) return inputContent; // 如果没有关键字,直接返回原始内容

  // 转义用户输入的关键字,避免正则表达式特殊字符冲突
  const escapeRegExp = (str) =>
    str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");

  // 创建匹配关键字的正则表达式
  const keywordRegex = new RegExp(`(${escapeRegExp(keyword)})`, "gi");

  // 使用 DOMParser 解析 HTML
  const parser = new DOMParser();
  const doc = parser.parseFromString(inputContent, "text/html");

  // 提取纯文本和对应节点
  const textNodes = [];
  function extractTextNodes(node) {
    if (node.nodeType === Node.TEXT_NODE) {
      textNodes.push({ node, text: node.textContent });
    } else if (node.nodeType === Node.ELEMENT_NODE) {
      Array.from(node.childNodes).forEach(extractTextNodes);
    }
  }
  extractTextNodes(doc.body);

  // 合并纯文本
  const combinedText = textNodes.map((item) => item.text).join("");

  // 查找关键字在纯文本中的位置
  const matches = [];
  let match;
  while ((match = keywordRegex.exec(combinedText)) !== null) {
    matches.push({ start: match.index, end: match.index + match[0].length });
  }

  // 在原始文本节点中插入高亮
  let currentIndex = 0;
  matches.forEach(({ start, end }) => {
    textNodes.forEach(({ node, text }) => {
      const nodeEnd = currentIndex + text.length;

      if (start < nodeEnd && end > currentIndex) {
        const localStart = Math.max(start - currentIndex, 0);
        const localEnd = Math.min(end - currentIndex, text.length);

        const highlightedText =
          text.slice(0, localStart) +
          `<span class="highlight">${text.slice(localStart, localEnd)}</span>` +
          text.slice(localEnd);

        const temp = document.createElement("div");
        temp.innerHTML = highlightedText;

        // 替换节点
        const parent = node.parentNode;
        while (temp.firstChild) {
          parent.insertBefore(temp.firstChild, node);
        }
        parent.removeChild(node);

        // 更新当前文本
        node.textContent = text;
      }

      currentIndex += text.length;
    });
  });

  // 返回处理后的 HTML
  return doc.body.innerHTML;
}

关键字忽略大小写

function highlightKeyword(inputContent, keyword) {
  if (!keyword) return inputContent; // 关键字为空直接返回

  const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");

  // 统一大小写匹配
  const keywordLower = keyword.toLowerCase();
  const regex = new RegExp(`(${escapeRegExp(keywordLower)})`, "gi"); // 🔥【提前正则表达式】

  // 判断是否是普通文本
  const isPlainText = !/<[a-z][\s\S]*>/i.test(inputContent);
  if (isPlainText) {
    return inputContent.replace(regex, `<span class="highlight">$1</span>`);
  }

  // 解析 HTML
  const parser = new DOMParser();
  const doc = parser.parseFromString(inputContent, "text/html");

  const textNodes = [];
  function extractTextNodes(node) {
    if (node.nodeType === Node.TEXT_NODE) {
      textNodes.push({ node, text: node.textContent });
    } else if (node.nodeType === Node.ELEMENT_NODE) {
      Array.from(node.childNodes).forEach(extractTextNodes);
    }
  }
  extractTextNodes(doc.body);

  // 合并所有文本(保持原顺序)
  let combinedText = textNodes.map((item) => item.text).join("");

  // 在合并后的文本中查找匹配位置(忽略大小写)
  const matches = [];
  let match;
  while ((match = regex.exec(combinedText)) !== null) {
    matches.push({ start: match.index, end: match.index + match[0].length });
  }

  // 在原始 HTML 结构中插入高亮标签
  let currentIndex = 0;
  matches.forEach(({ start, end }) => {
    textNodes.forEach(({ node, text }) => {
      const textLower = text.toLowerCase();
      const nodeEnd = currentIndex + text.length;

      if (start < nodeEnd && end > currentIndex) {
        const localStart = Math.max(start - currentIndex, 0);
        const localEnd = Math.min(end - currentIndex, text.length);

        // 保留原始大小写的文本进行替换
        const highlightedText =
          text.slice(0, localStart) +
          `<span class="highlight">${text.slice(localStart, localEnd)}</span>` +
          text.slice(localEnd);

        const temp = document.createElement("div");
        temp.innerHTML = highlightedText;

        const parent = node.parentNode;
        while (temp.firstChild) {
          parent.insertBefore(temp.firstChild, node);
        }
        parent.removeChild(node);
      }

      currentIndex += text.length;
    });
  });

  return doc.body.innerHTML;
}

js:highlight.js实现代码的语法高亮 译文:highlight.js为Web突出显示语法文档。 阅读详情

相关推荐

JavaScript 替换和高亮文本的示例

在 JavaScript 中,我们经常需要对文本进行替换和高亮显示。这在处理用户输入、搜索功能和文本处理等方面非常常见。在本文中,我将为你展示一个基本的 JavaScript 示例,演示如何使用replace方法来替换文本,并使用 CSS 来实现高亮效果。

ByteZenith的博客 260

js实现搜索关键字高亮

开发背景:vue项目 实现代码: // 关键字变红 function keywordRed (keyword) { if (keyword && keyword !== '') { const nodesObj = document.getElementsByClassName('item-title') const nodes = Object.values(nodesObj) nodes.forEach(item => { cons

我的博客 6472

ComfyUI工作流换脸节点报错ReActorFaceSwap

找到自己ComfyUI安装目录的custom_nodes下是否有这个comfyui-reactor-node-main。大家在借鉴别人工作流进行AI换脸的时候,如果遇到ReActorFaceSwap报错提示,莫慌,看我的,两步解决问题。这里千万注意不要嵌套文件夹,保证点击去这个文件就可以看到内置的配置文件!找到自己ComfyUI安装目录的facerestore_models。如果有这个文件,直接跳过,去下一步。如果没有,可以去Git官网下载。

qq_70810809的博客 9015

js全局搜索高亮显示

输入想要搜索的内容:对应内容高亮显示: 错误实现: 1.直接更改body的innerHTML,导致绑定在输入框上的input事件失效这是因为,修改body的innerHTML相当于重写了body里面的输入框,这就相当于创建了另外一个dom对象,之前渲染的dom跟这个新的dom对象没有关系,所以就导致了事件的丢失。2.每次不还原初始状态,导致搜索内容改变后,原来的高亮依然存在所以要在一开始记录初始innerHTML,每次input事件触发后要先还原回初始状态。3.没有考虑到标签名

m0_75276704的博客 682

【AutoSar CP】SoAd模块

比如对于特定的PDU,其PduId在程序编译时就确定了,但是在代码运行中,该PduId可能需要发送到不同的远端ip,这时就需要用SoAd来设置连接远端地址信息。SoAdSocketConnectionGroup(连接参数)SoAdSocketRoute(接收数据)SoAdRoutingGroup(开关)SoAdPduRoute(发送数据)

至道无难,唯嫌拣择。 1686

ArcGIS 10.4 Desktop安装步骤。

步骤 1 :安装 LicenseManager 有了安装包以后,我们进入安装包文件目录,如图所示,首先需要安装ArcGIS license manager,即点击打开图中红色框中exe文件。 PS:安装 LicenseManager,关于 License 的安装路径一般默认即可,因为很小的,装C 盘也无所谓了,当然了自己改了也可以的,但是不建议! 即便修改路径,建议只改盘符,不修改相对路径方式! 如:C:\Program Files (x86)\ArcGIS\License10.6 修改为 D:\.

IT爱好者 2万+

原生JS实现代码高亮功能

原生js实现代码高亮。词法分析,BNF,产生式,乔姆斯基谱系。

qq_33297737的博客 2825

基于奥比中光Orbbec Astra Pro与ROS实现实时3D环境建模:orb_slam2实战指南

本文提供了一份详细的实战指南,介绍如何使用奥比中光Orbbec Astra Pro深度摄像头与ROS系统,部署并运行ORB-SLAM2算法,实现实时3D环境建模与定位。内容涵盖从驱动安装、环境配置、算法编译到摄像头标定与性能调优的全流程,旨在帮助开发者快速搭建一套高性价比的视觉SLAM系统。

weixin_29054399的博客 334

javascript实现文本高亮

  一个实验项目需要用到文本高亮的功能,使用javascript实现文本高亮的方法,暂时能想到的方法就是在给文本加上标签,然后添加样式。而如何给文本包裹一个标签,暂时也只想到两个方法:1、使用dom操作 2、用正则修改html代码   下午试验了一下使用dom操作的方法   /** * 使用原生javascript操作dom,实现文本高亮 */ var HIGH_LIGHT...

永无止境 1568

基于STM32L4XX、HAL库的 L76KB-A58定位模块驱动程序设计

/ 确保字符串终止。// 缓冲区溢出,重置。// 重置缓冲区索引。支持GPS、GLONASS、Galileo、北斗和QZSS多系统定位。case 1: // UTC时间。// 配置GPS模块(可选)// 查找GGA语句。// 启动UART接收。// USART1初始化函数。内置LNA和SAW滤波器。

zhusl6688的博客 349

第01章 Hermes Agent 是什么

如果读者所在的开发团队已经引入了 Cursor、Claude Code 这类 AI IDE,可能会有一个困惑:写代码已经有 AI 帮忙了,还需要 Hermes Agent 做什么?这一章将给出答案。Hermes Agent 不是另一个写代码的 AI,而是一个常驻在团队里的"AI 协作成员",专门负责写代码之外的协作环节——讨论需求、审查代码、查日志、监控告警、生成报告。学完本章,读者将清楚 Hermes 的定位以及它在团队里的角色。

亢少军的博客 75

mark.js文本高亮终极指南:JavaScript库快速上手与实用技巧

mark.js是一款强大的JavaScript文本高亮库,能够动态标记搜索词或自定义正则表达式,支持重音符识别、iframe跨域高亮、元素级过滤等高级功能。无论是网站搜索结果的实时高亮,还是表格数据的筛选突出显示,这款轻量级工具都能让您的项目焕然一新!🎯 ## 🚀 快速上手:三分钟掌握核心用法 ### 安装部署超简单 通过npm一键安装: ```bash npm install mar

gitblog_00233的博客 375

基于STM32、HAL库的GZP6816D气压传感器 驱动程序设计

测量范围:0-16kPa(可根据型号不同有变化)工作电压:1.8V-3.6V。高精度:±1% FS。

corlin6688的博客 217

利用JavaScript在HTML页面搜索并高亮匹配的文本

在没有查找功能的环境中给网页加上搜索并高亮匹配内容的功能。

yivifu的专栏 2753

MSVS C# Matlab的混合编程系列2 - 构建一个复杂(含多个M文件)的动态库:

本节我们尝试将一个有很多函数和文件的Matlab算法文件集成到C#的项目里面。

山云的专栏 2068

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

js文本高亮

文字高亮 function init() { var keys = new Array("aa", "bb", "cc"); var keysOther = new Array("11",

嘻嘻哈哈的专栏 2417

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HR.js:轻量级DOM文本高亮与替换插件

HR.js:轻量级DOM文本高亮与替换插件 项目基础介绍与主要编程语言 HR.js 是一个轻量级的 JavaScript 插件,专注于在 DOM 中实现文本的高亮和替换功能。该项目由 mburakerman 开发并维护,采用 MIT 许可证开源,允许开发者自由使用和修改。HR.js 的核心编程语言是 JavaScript,这使得它能够轻松集成到任何基于 Web 的项目中,无需额外的依赖。 项目的核...

gitblog_00142的博客 774

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

3分钟掌握mark.js:文本高亮终极指南

在现代Web开发中,文本高亮功能已成为提升用户体验的关键技术。mark.js作为一款轻量级但功能强大的JavaScript库,专为解决各种文本标记需求而生。无论是搜索结果的视觉反馈,还是文档内容的关键信息突出,这个开源项目都能提供完美的解决方案。 ## 🚀 快速入门:5分钟完成首次集成 ### 环境准备与安装 mark.js支持多种安装方式,让开发者能够根据项目需求灵活选择: **NPM

gitblog_00070的博客 526

JavaScript中只高亮选中文本框中指的的文本

用focus()方法是高亮全部文本  function   selectLength(textbox,start,len)   //设置高亮(对象,开始位置,长度)  {     try     {     var   r   =textbox.createTextRange();         r.moveEnd(character,len-(textbox.value.length-

3274

如何快速实现前端文本高亮:mark.js 终极指南

在现代Web开发中,文本高亮功能已经成为搜索、文档查看和数据展示等场景的必备特性。**mark.js**作为一款轻量级、高性能的JavaScript关键词高亮库,能够轻松解决各种复杂的文本标记需求。无论是简单的关键词搜索,还是跨元素、跨iframe的复杂场景,mark.js都能提供完美的解决方案。🎯 ## 🔥 为什么选择 mark.js? **mark.js** 拥有众多优势,使其成为前端

gitblog_00657的博客 375

【pdf.js】pdf检索对应文本和高亮功能

本文主要针对网页端 PDF 本地预览场景,支持通过关键字对 PDF 进行检索查询,当点击检索结果列表中的对应关键字时,可同步在预览界面中触发内容搜索 —— 不仅能精准跳转到匹配内容所在的 PDF 页码,还能对目标文字进行高亮显示。此外,方案还涵盖了 iframe 嵌入预览、文字高亮等核心功能的实现细节,并针对性解决了基于 pdf.js 开发时常见的跨域问题,为网页端 PDF 预览与检索需求提供了完整技术参考

stc_ljc的博客 1582

JavaScript实战笔记(四) 选中文本高亮

以下代码可以实现用户选中文本之后点击高亮按钮,高亮选中文本,支持多种颜色高亮

半虹小站 1699

JS选中文本高亮

实现选中文本高亮,主要用到的两个API: Window.getSelection 用于获取选中文本 document.execCommand 用于将选中文本高亮 完整代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>demo</title> </head> <body> <div o

ZionHH的博客 2901

mark.js 实战应用:在搜索结果中实现智能文本高亮

在现代网页应用中,为用户提供精准的搜索结果高亮功能是提升用户体验的关键环节。**mark.js** 作为一款轻量级 JavaScript 文本高亮库,能够帮助开发者轻松实现关键词高亮效果,支持多种高级特性如正则匹配、跨元素搜索和自定义样式。本文将从实用角度出发,介绍如何在搜索场景中快速集成 mark.js,打造媲美专业搜索引擎的高亮体验。 ## 🌟 为什么选择 mark.js? mark.j

gitblog_00331的博客 723

Javascript特效之高亮显示选中的文本框

                           Javascript特效之高亮显示选中的文本框 今天我们来看看怎么实现网页文本框选中时高亮显示文本框以提醒当前正在输入的文本框。 效果: 当我们选中文本框时,文本框背景颜色变为深蓝色。 实现思路: 用js为文本框注册onfocus获得焦点事件,在获得焦点事件触发时添加写好的高亮样式即可。 js代码: var currentl...

a271720559的博客 3122

5分钟精通mammoth.js文本高亮:从DOCX样式到CSS的完美映射

当企业文档系统需要批量转换Word文档时,**文本高亮(Highlight)** 样式的丢失往往导致关键信息弱化。作为一款专注于DOCX到HTML转换的开源库,mammoth.js提供了强大的样式映射机制,但大多数开发者仅停留在基础转换层面。本文将系统讲解如何通过**Style Map(样式映射)** 实现文本高亮的精准控制,从源码解析到实战配置,让你的转换结果既保留原始格式,又符合Web展示需求...

gitblog_00216的博客 1171
上一篇: convertJSONStringsInObject
下一篇: 提示器模板
composurext
博客等级 码龄10年 15粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值