js高亮文本

devtools/2025/1/20 1:55:41/

高亮文本

javascript">const inputs = ["这是一个普通文本,包含关键字测试。",'<p style="font-size: 10px">这是一个<span>GVM</span> <strong>测试</strong>内容。</p>',
];const keywords = ["测试", "GVM"];
javascript">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);// 返回处理后的 HTMLreturn doc.body.innerHTML;
}

跨标签命中

javascript">function highlightKeyword(inputContent, keyword) {if (!keyword) return inputContent; // 如果没有关键字,直接返回原始内容// 转义用户输入的关键字,避免正则表达式特殊字符冲突const escapeRegExp = (str) =>str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");// 创建匹配关键字的正则表达式const keywordRegex = new RegExp(`(${escapeRegExp(keyword)})`, "gi");// 使用 DOMParser 解析 HTMLconst 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;});});// 返回处理后的 HTMLreturn doc.body.innerHTML;
}

http://www.ppmy.cn/devtools/151975.html

相关文章

2025 年三个月自学计划 网络安全(黑客技术)

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“[渗透测试](https://docs.qq.com/doc/DY2FFR01PdWNUaUV5 "渗透测试")” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无…

leetcode-买卖股票问题

309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 动态规划解题思路&#xff1a; 1、暴力递归&#xff08;难点如何定义递归函数&#xff09; 2、记忆化搜索-傻缓存法&#xff08;根据暴力递归可变参数确定缓存数组维度&#xff09; 3、严格表结构依…

电脑风扇声音大怎么办? 原因及解决方法

电脑风扇是电脑的重要组件之一&#xff0c;它的作用是为电脑的各个部件提供冷却&#xff0c;防止电脑过热。然而&#xff0c;有时候我们会发现电脑风扇的声音特别大&#xff0c;不仅影响我们的使用体验&#xff0c;也可能是电脑出现了一些问题。那么&#xff0c;电脑风扇声音大…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

安卓java端service如何在native进程进行访问-跨进程通讯高端知识

背景&#xff1a; 近来有学员朋友在马哥vip群里提出关于跨进程相关的问题&#xff0c;具体问题如下&#xff1a; 想要在纯native进程中获取当前android系统有多个display&#xff0c;然后获取每个display的Id。但是这个获取display的数目和id的接口其实是在systemserver进程的…

MySQL程序之:使用类似URI的字符串或键值对连接到服务器

本节介绍使用类似URI的连接字符串或键值对来指定如何为MySQLShell等客户端建立到MySQL服务器的连接。 以下MySQL客户端支持使用类似URI的连接字符串或键值对连接到MySQL服务器&#xff1a; MySQL Shell实现X DevAPI的MySQL连接器 本节记录了所有有效的类似URI的字符串和键值…

matlab函数的主要目的是对包含在 Excel 电子表格中的实验数据进行模型拟合

function Latex_Fitting_Sample_Code% clear screen and all variablesclc; clear;% 包含恒定通量横流结垢实验数据的 Excel 电子表格filename = Experimental Data.xlsx;% 包含模型拟合数据的 Excel 电子表格filename2 = Model Fit.xlsx; % 下面的循环采用不规则滤饼模型拟合 …

Uniapp判断设备是安卓还是 iOS,并调用不同的方法

在 UniApp 中&#xff0c;可以通过 uni.getSystemInfoSync() 方法来获取设备信息&#xff0c;然后根据系统类型判断当前设备是安卓还是 iOS&#xff0c;并调用不同的方法。 示例代码 export default {onLoad() {this.checkPlatform();},methods: {checkPlatform() {// 获取系…