当前位置: 首页 > news >正文

vue3 处理文字 根据文字单独添加class

下面写的是根据后端返回的html 提取我需要的标签和字 将他们单独添加样式

后端返回的数据 大概类似于'<h1>2024年“双11”购物节网络零售监测报告</h1><p>表1 “双11” 期间网络零售热销品类TOP10</p>'

function checkfun(newList){if (newList) {let processedAnswer = newList// 这个是判断如果是h2标签里面只有前言这两字的时候就添加class.replace(    /<h2>(前言)<\/h2>/gs, '<h2><span class="titleclass">$1</span></h2>'// 这个是判断如果是h2标签里面只有报告说明这两字的时候就添加class).replace(/<h2>(报告说明)<\/h2>/gs,'<h2><span class="titleclass">$1</span></h2>'// 这个是判断如果是如果包含表1,图1等的时候就添加class).replace(/((?:表|图)\d+.*?)(?=(?:<p>|<\/p>|<h2>|<h3>|<li>|<\/li>|$))/gs,'<span class="picture">$1</span>')// 这个是判断如果是如果注的时候就添加class.replace(/((?:注)\d+.*?)(?=(?:<p>|<\/p>|<h2>|<h3>|<li>|<\/li>|$))/gs,'<span class="pour">$1</span>')// 添加表格处理逻辑  --- 这个是我根据标准的table格式进行添加classconst doc = parseHTML(processedAnswer);const tables = doc.querySelectorAll('table');tables.forEach((table) => {// 判断是否是table是否只有一个表头const thead = table.querySelector('thead');const theadLength = thead?.rows[0]?.cells.length || 0;if (theadLength === 1) {table.classList.add('single-header');}// 判断表身里面的数据 是否是数字const tbody = table.querySelector('tbody');tbody?.querySelectorAll('td').forEach((td) => {if (isStringNumber(td.textContent)) {td.classList.add('single-cell');}});// 检查表头是否包含“排名”字段  -- 并且排名这个字段必须在第一位const headers = table.querySelectorAll('thead th:first-child');  const rankIndex = Array.from(headers).findIndex(header => header.textContent.trim() == '排名');  // 如果找到排名列,为所有对应单元格添加样式if (rankIndex !== -1) {// 获取所有行数据const rows = table.querySelectorAll('tbody tr');rows.forEach(row => {const cells = row.querySelectorAll('td');if (cells.length > rankIndex) {cells[rankIndex].classList.add('rank-column');}});}});// 获取到所有的p标签和li标签 判断里面是否有数字和英文 如果有的话将他们单独添加classconst pElements = doc.querySelectorAll('p, li');pElements.forEach(p => {const tempDiv = document.createElement('div');tempDiv.innerHTML = p.innerHTML;const walker = document.createTreeWalker(tempDiv, NodeFilter.SHOW_TEXT);let node;while ((node = walker.nextNode())) {const parent = node.parentNode;const text = node.textContent;let lastIndex = 0;// 改进后的正则表达式const numberRegex = /(-?\d+(?:\.\d+)?|[a-zA-Z']+)/g;let numberMatch;while ((numberMatch = numberRegex.exec(text)) !== null) {const span = document.createElement('span');span.className = 'english-style';span.textContent = numberMatch[0];const textBefore = document.createTextNode(text.slice(lastIndex, numberMatch.index));parent.insertBefore(textBefore, node);parent.insertBefore(span, node);lastIndex = numberRegex.lastIndex;}// 添加剩余文本if (lastIndex < text.length) {const remainingText = document.createTextNode(text.slice(lastIndex));parent.insertBefore(remainingText, node);}parent.removeChild(node);}p.innerHTML = tempDiv.innerHTML;});// 遍历所有p标签进行处理doc.querySelectorAll('p').forEach(p => {if (p.innerHTML.includes('![](')) {  // 如果是图片格式的话const span = document.createElement('span');span.innerHTML = p.innerHTML;p.replaceWith(span);}});// 将处理后的DOM转换回HTML字符串processedAnswer = serializeHTML(doc.body);processedList.value = processedAnswer}
}
const isStringNumber = (str) => {// 匹配整数、小数、负数const numberRegex = /^[-+]?(?:\d{1,3}(?:,\d{3})*(?:\.\d+)?|\d+(?:\.\d*)?|\.\d+)$/;return numberRegex.test(str);
};
// 转化为html
function parseHTML(htmlString) {const parser = new DOMParser();return parser.parseFromString(htmlString, 'text/html');
}
// 添加HTML序列化工具函数
function serializeHTML(node) {const temp = document.createElement('div');temp.appendChild(node.cloneNode(true));return temp.innerHTML;
}

px,pt,em换算表 | 菜鸟教程https://www.runoob.com/w3cnote/px-pt-em-convert-table.html像素与磅换算 -- EndMemohttps://endmemo.com/topography/pixelpointcn.html


http://www.mrgr.cn/news/97577.html

相关文章:

  • linux第三次作业
  • JVM核心机制:类加载×字节码引擎×垃圾回收机制
  • 使用Docker安装及使用最新版本的Jenkins
  • el-table,新增、复制数据后,之前的勾选状态丢失
  • STM32江科大----IIC
  • 高安全等级车规芯片在星载控制终端上的应用
  • Nodejs回调函数
  • python应用之使用pdfplumber 解析pdf文件内容
  • 使用stm32cubeide stm32f407 lan8720a freertos lwip 实现udp client网络数据转串口数据过程详解
  • JavaScript基础--22-call、apply 和 bind
  • #MongoDB 快速上手
  • springcloud进阶
  • Python星球日记 - 第10天:模块与包
  • php调用大模型应用接口实现流式输出以及数据过滤
  • 原子操作(cpp atomic)
  • UE4初学笔记
  • Vue3+Vite+TypeScript+Element Plus开发-06.Header响应式菜单缩展
  • 2025 数字中国创新大赛数字安全赛道数据安全产业积分争夺赛初赛-东部赛区WriteUp
  • C++第14届蓝桥杯b组学习笔记
  • xv6-labs-2024 lab2