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

news2025/4/15 22:59:14

下面写的是根据后端返回的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格式进行添加class
        const 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标签 判断里面是否有数字和英文 如果有的话将他们单独添加class
        const 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.coloradmin.cn/o/2330852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jupyter Notebook不能自动打开默认浏览器怎么办?

在安装anaconda的过程中,部分用户可能会遇到,打开Jupyter Notebook的时候,不会弹出默认浏览器。本章教程给出解决办法。 一、生成一个jupyter默认配置文件 打开cmd,运行以下命令,会生成一个jupyter_notebook配置文件。 jupyter notebook --generate-config二、编辑jupyter_…

Spring Boot 工程创建详解

2025/4/2 向全栈工程师迈进&#xff01; 一、SpingBoot工程文件的创建 点击Project Structure 然后按着如下点击 最后选择Spring Boot &#xff0c;同时记得选择是Maven和jar&#xff0c;而不是war。因为Boot工程内置了Tomcat&#xff0c;所以不需要war。 紧接着选择Spring We…

Spring Boot + MyBatis + Maven论坛内容管理系统源码

项目描述 xxxForum是一个基于Spring Boot MyBatis Maven开发的一个论坛内容管理系统&#xff0c;主要实现了的功能有&#xff1a; 前台页面展示数据、广告展示内容模块&#xff1a;发帖、评论、帖子分类、分页、回帖统计、访问统计、表单验证用户模块&#xff1a;权限、资料…

国网B接口协议资源上报流程详解以及上报失败原因(电网B接口)

文章目录 一、B接口协议资源上报接口介绍B.2.1 接口描述B.2.2 接口流程B.2.3 接口参数B.2.3.1 SIP头字段B.2.3.2 SIP响应码B.2.3.3 XML Schema参数定义 B.2.4 消息示例B.2.4.1 上报前端系统的资源B.2.4.2 响应消息 二、B接口资源上报失败常见问题&#xff08;一&#xff09;证书…

布谷一对一直播源码android版环境配置流程及功能明细

一&#xff1a;举例布谷交友&#xff08;一对一直播源码&#xff09;搭建部署的基本环境说明 1. 首先安装Center OS 7.9系统&#xff0c;硬盘最低 40G 2. 安装宝塔环境 https://bt.cn&#xff08;强烈推荐使用&#xff09; 3. 安装环境 ● PHP 7.3&#xff08;安装redis扩展…

【Netty4核心原理④】【简单实现 Tomcat 和 RPC框架功能】

文章目录 一、前言二、 基于 Netty 实现 Tomcat1. 基于传统 IO 重构 Tomcat1.1 创建 MyRequest 和 MyReponse 对象1.2 构建一个基础的 Servlet1.3 创建用户业务代码1.4 完成web.properties 配置1.5 创建 Tomcat 启动类 2. 基于 Netty 重构 Tomcat2.1 创建 NettyRequest和 Netty…

【AI学习】初步了解TRL

TRL&#xff08;Transformer Reinforcement Learning&#xff09; 是由 Hugging Face 开发的一套基于强化学习&#xff08;Reinforcement Learning, RL&#xff09;的训练工具&#xff0c;专门用于优化和微调大规模语言模型&#xff08;如 GPT、LLaMA 等&#xff09;。它结合了…

阿里云oss视频苹果端无法播放问题记录

记录一下苹果端视频不可以播放的原因. 看了一下其他视频可以正常播放,但是今天客户发来的视频无法正常播放.咨询过阿里云售后给出的原因是编码格式过高. 需要调整编码格式为:baseline, 下面记录如何使用ffmpeg修改视频的编码格式. 下载文件(可从官方下载) 配置环境变量(系统变…

Ubuntu离线安装mysql

在 Ubuntu 24.04 上离线安装 MySQL 的步骤如下(支持 MySQL 8.0 或 8.4): 一.安装方法 此次安装是按照方法一安装,其它方法供参考: 安装成功截图: 安全配置截图: sudo mysql_secure_installation 登录测试: 方法一:使用 apt-rdepends 下载依赖包(推荐) 1. 在联网…

IntelliJ IDEA下开发FPGA——FPGA开发体验提升__上

前言 由于Quartus写代码比较费劲&#xff0c;虽然新版已经有了代码补全&#xff0c;但体验上还有所欠缺。于是使用VS Code开发&#xff0c;效果如下所示&#xff0c;代码样式和基本的代码补全已经可以满足开发&#xff0c;其余工作则交由Quartus完成 但VS Code的自带的git功能&…

SpringBoot底层-数据源自动配置类

SpringBoot默认使用Hikari连接池&#xff0c;当我们想要切换成Druid连接池&#xff0c;底层原理是怎样呢 SpringBoot默认连接池——Hikari 在spring-boot-autoconfiguration包内有一个DataSourceConfiguraion配置类 abstract class DataSourceConfiguration {Configuration(p…

数字内容个性化推荐引擎构建

实时数据驱动推荐优化 现代数字内容体验的核心竞争力在于系统对用户需求的即时捕捉与响应。通过实时数据流处理技术&#xff0c;推荐引擎能够同步采集用户点击、停留时长、交互轨迹等多维度行为数据&#xff0c;并借助分布式计算框架在毫秒级完成特征提取与模式识别。例如&…

【工具】Redis管理工具推荐

【运维】Redis管理工具推荐 Another Redis Desktop Manager &#x1f680;&#x1f680;&#x1f680; 更快、更好、更稳定的Redis桌面(GUI)管理客户端&#xff0c;兼容Windows、Mac、Linux&#xff0c;性能出众&#xff0c;轻松加载海量键值 AnotherRedisDesktopManager 发行版…

【高校主办】2025年第四届信息与通信工程国际会议(JCICE 2025)

重要信息 会议网址&#xff1a;www.jcice.org 会议时间&#xff1a;2025年7月25-27日 召开地点&#xff1a;哈尔滨 截稿时间&#xff1a;2025年6月15日 录用通知&#xff1a;投稿后2周内 收录检索&#xff1a;EI,Scopus 会议简介 JCICE 2022、JCICE 2023、JCICE 2…

【区块链安全 | 第三十一篇】合约(五)

文章目录 合约库库中的函数签名和选择器库的调用保护合约 库 库与合约类似,但它们的目的是仅在特定地址上部署一次,并通过 EVM 的 DELEGATECALL(在 Homestead 之前是 CALLCODE)功能重复使用其代码。这意味着如果调用库函数,它们的代码将在调用合约的上下文中执行,即 th…

系统与网络安全------Windows系统安全(8)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 DNS DNS概述 为什么需要DNS系统 www.baidu.com与119.75.217.56&#xff0c;哪个更好记&#xff1f; 互联网中的114查号台/导航员 DNS&#xff08;Domian Name System&#xff0c;域名系统&#xff09;的功…

ROS云课三分钟-差动移动机器人巡逻报告如何撰写-中等报告

评语&#xff1a; 成绩中等&#xff08;70/100&#xff09;&#xff0c;具体如下&#xff1a; 1. 摘要部分 问题描述&#xff1a; 内容空洞&#xff1a;摘要过于简短&#xff0c;仅简要概述了研究内容和实现方法&#xff0c;未突出研究的创新点或重要性。缺乏细节&#xff1…

Java8+Spring Boot + Vue + Langchain4j 实现阿里云百炼平台 AI 流式对话对接

1. 引言 在本文中&#xff0c;我们将介绍如何使用 Spring Boot、Vue.js 和 Langchain4j&#xff0c;实现与 阿里云百炼平台 的 AI 流式对话对接。通过结合这些技术&#xff0c;我们将创建一个能够实时互动的 AI 聊天应用。 这是一个基于 Spring Boot Vue.js Langchain4j 的智…

Dify接口api对接,流式接收流式返回(.net)

试了好多种方法除了Console.WriteLine()能打印出来&#xff0c;试了好些方法都不行&#xff0c;不是报错就是打印只有一行&#xff0c;要么就是接收完才返回...下面代码实现调用api接收流式数据&#xff0c;并进行流式返回给前端&#xff1a; using Furion.HttpRemote; using …

代码随想录算法训练营第五十二天|图论专题: 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿

101. 孤岛的总面积 本题要求找到不靠边的陆地面积&#xff0c;那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋&#xff0c;然后再去重新遍历地图 统计此时还剩下的陆地就可以了。 1、从左边和后边向中间遍历 2、从上边和下边向中间遍历…