写一个方法检测页面中的所有标签是否正确闭合

news/2024/11/29 3:29:11/文章来源:https://www.cnblogs.com/ai888/p/18575570
function checkTagClosure(htmlString) {// 使用栈来跟踪打开的标签const tagStack = [];// 正则表达式匹配标签 (包括自闭合标签)const tagRegex = /<\/?([a-zA-Z][a-zA-Z0-9]*)\s*\/?>/g;let match;while ((match = tagRegex.exec(htmlString)) !== null) {const tagName = match[1];const isClosingTag = match[0].startsWith("</");if (isClosingTag) {// 闭合标签,检查栈顶是否匹配if (tagStack.length === 0 || tagStack.pop() !== tagName) {return {isValid: false,error: `Unexpected closing tag: ${tagName}, at index: ${match.index}`,};}} else {//  非自闭合标签,压入栈中if (!isSelfClosingTag(tagName)) { // 检查是否为自闭合标签tagStack.push(tagName);}}}// 检查栈是否为空,如果不为空,则存在未闭合的标签if (tagStack.length > 0) {return {isValid: false,error: `Unclosed tags: ${tagStack.join(", ")}`,};}return { isValid: true };
}function isSelfClosingTag(tagName) {const selfClosingTags = ["area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", "track", "wbr"];return selfClosingTags.includes(tagName.toLowerCase());
}// 示例用法:
const html1 = "<div><h1>Hello</h1><p>World</p></div>";
const result1 = checkTagClosure(html1);
console.log(result1); // { isValid: true }const html2 = "<div><h1>Hello<p>World</div>";
const result2 = checkTagClosure(html2);
console.log(result2); // { isValid: false, error: "Unexpected closing tag: div, at index: 18" }const html3 = "<div><img src='test.jpg' alt='test'></div>";
const result3 = checkTagClosure(html3);
console.log(result3); // { isValid: true }const html4 = "<div><p>Test</div>";
const result4 = checkTagClosure(html4);
console.log(result4); // { isValid: false, error: 'Unexpected closing tag: div, at index: 10'}const html5 = "<div><p>Test</p>";
const result5 = checkTagClosure(html5);
console.log(result5); // { isValid: false, error: 'Unclosed tags: div' }

改进和说明:

  • 处理自闭合标签: 增加了 isSelfClosingTag 函数来处理自闭合标签,避免将它们误判为未闭合标签。
  • 错误信息更详细: 返回的错误信息包含了未闭合或错误闭合的标签名称以及错误发生的位置索引,方便调试。
  • 使用正则表达式: 使用正则表达式匹配标签,更加灵活和健壮。
  • 区分大小写: 将标签名转换为小写再进行比较,避免因为大小写问题导致误判。
  • 更全面的自闭合标签列表: 包含了更全面的自闭合标签列表。

这个改进后的版本可以更准确地检测 HTML 标签的闭合情况,并提供更详细的错误信息。 它仍然有一些局限性,例如无法处理复杂的嵌套情况和注释,但在大多数情况下可以有效地工作。 对于更复杂的场景,建议使用专业的 HTML 解析器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843226.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【api开发】API通信协议总结

API协议 1. REST(Representational State Transfer) 一种用于设计网络应用程序的架构风格。它强调无状态通信,使用标准的HTTP方法(GET、POST、PUT、DELETE),并通过URL识别资源。 2. GraphQL 一种API查询语言,允许客户端精确请求它们所需的数据,不多也不少。这种效率是G…

你有使用过picture标签吗?说说它有哪些运用场景

是的,我了解 <picture> 元素。它是一个 HTML5 元素,用于为不同的屏幕尺寸、设备像素比或文件格式提供不同的图像版本。浏览器会根据当前环境选择最合适的图像显示,从而优化页面加载速度和用户体验。 <picture> 元素本身并不显示图像,而是充当一个容器,其中包含…

小米10ultra ISO12233 主摄OV48C 不同亮度下比较

夜间室内几乎完全黑的环境 结论 1200w像素,没啥差别,吃满像素。4800w像素,也没啥区别 IMG_20241129_022234.HEIC 仅有闪光灯 质量 低 1.49MB 1/50s IMG_20241129_022238.HEIC 头灯补光 质量 低 1.65MB 1/100s 34 38 4800w像素 IMG_20241129_022250.HEIC 4800w像素 质量低…

Git 快速入门:全面了解与安装步骤

Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 于 2005 年创建,最初是为了更好地管理 Linux 内核开发而设计。Git用于跟踪计算机文件的变化,特别是源代码文件。它允许多个开发者同时合作开发软件项目,同时保留完整的版本历史,确保代码的稳定性和可追溯性。一、关…

如何解决 GoPro 13 拍摄 4K HDR 视频过热关机问题 All In One

如何解决 GoPro 13 拍摄 4K HDR 视频过热关机问题 All In One GoPro 过热关机如何解决 GoPro 13 拍摄 4K HDR 视频过热关机问题 All In OneGoPro 过热关机测试条件 室温 20 度 开启 HLG HDR 画面 16:9 分辨率 4K 帧率 60Hz 开启 GPS HyperSmooth: AutoBoost 比特位深: 10-Bit 比…

【模板】堆

【模板】堆 题目描述 给定一个数列,初始为空,请支持下面三种操作:给定一个整数 \(x\),请将 \(x\) 加入到数列中。 输出数列中最小的数。 删除数列中最小的数(如果有多个数最小,只删除 \(1\) 个)。输入格式 第一行是一个整数,表示操作的次数 \(n\)。 接下来 \(n\) 行,每…

FIFO 缓存算法很简单,但也可以聊挺久

作者:秦怀 1 简介 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,这句话就是整个计算机软件以及系统设计中的核心思想,而缓存对这一思想的一种实践。 缓存,总归会受到存储空间的限制,当缓存的空间不足的时候,如果在保持一定系统文档的情况下,还能兼顾到…

安装在C盘的软件移到其它盘

移动Office到D盘为例,Office默认安装位置为"C:Program FilesMicrosoft Office",只需要把“Microsoft Office”这个目录移动到C盘以外的盘符,我们这里以D盘为例。1)在D盘新建一个文件夹“Program Files”,然后按“Shift键不放,点重启电脑”进入安全模式;2)在安…

HCIP-01 RSTP原理与配置

生成树是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。由于局域网规模的不断增长,生成树协议已经成为重要的局域网协议之一。 RSTP是生成树协议中的其中一个版本,它在STP的基础上,做了很多的改进…

Ripro V5日主题 v8.3 开心授权版 wordpress主题虚拟资源下载站首选主题模板

简介: RiPro主题全新V5版本,是一个优秀且功能强大、易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置,让您的网站设计体验更加舒适。同时支持了高级筛选、自带会员生态系统、超全支付接口等众多功能,无需依赖插件即可实…

从“三好”到“超三好”,智界新S7“卷”回来了!

11月26日,鸿蒙智行旗下智界新S7在华为Mate品牌盛典上市,并公布正式售价。智界新S7正式上市推出3款车型,智界新S7 Pro售价22.98万元,智界新S7 Max售价26.98万元起,智界新S7 Ultra售价31.98万元,首销期即刻下定,至高可享受价值35000元的权益。智界新S7将于12月1日开启交付…

yolo --- 模型训练

文件存放路径数据集标注软件pip install labelimg安装好后启动 labelimgOpen Dir:打开需要标注的图片路径 Change Save Dir:标注文件保存路径 View--->Auto Save mode:把这个勾上就不会每到下一张询问你一次按w可以显示画框的坐标十字 按D键可以切换到下一张 注意标注的标…