别用正则校验html标签结构,因其无法处理嵌套、注释、cdata、属性引号混用及等复杂语法;必须使用domparser或parse5等真实html解析器生成ast后校验。

HTML 中不能用正则校验标签结构
直接说结论:别用正则去解析或校验 HTML 文档结构,innerHTML、<script></script> 嵌套、属性引号混用、注释、CDATA 等会让任何正则迅速失效。浏览器原生的 DOMParser 或服务端真实 HTML 解析器(如 Python 的 BeautifulSoup、Node.js 的 parse5)才是正确选择。
如果只是校验简单 HTML 片段(如富文本输入框内容)
某些场景下,你确实只需要粗粒度过滤——比如禁止用户输入 <script></script>、<iframe></iframe>,或确保闭合标签大致匹配。这时可用正则做「防御性预筛」,但必须清楚它的局限:
-
/<script>]*>[\s\S]*?<\/script>/i</script>可捕获常见<script></script>块,但会被<script src="..."></script>或换行/注释绕过 -
/]*>/g能提取所有标签,但无法判断嵌套是否合法 - 不要试图用正则验证
<div class="foo" id="bar" data-x="123"> 的属性格式——引号类型、等号有无空格、未转义的 <code>"都会导致匹配崩溃真正该用正则的地方:校验 HTML 属性值内容
对属性值做内容限制是正则的合理用武之地,例如:
- 邮箱:
email="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"(注意:这是校验值,不是校验整个email="..."属性) - URL:
href="^https?:\/\/[^\s]+$",但需配合URL构造函数二次验证 - ID/Class 名:
id="^[a-zA-Z][a-zA-Z0-9_-]*$",避免以数字开头或含空格
关键点:先用 DOM 提取属性值(如
el.getAttribute('href')),再对值本身跑正则,而不是对整段 HTML 字符串跑。
html-to-pptx-converter下载使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
常见错误:用正则替换 HTML 标签实现「XSS 过滤」
这是高危操作。典型错误写法:
html.replace(/<script>]*>[\s\S]*?<\/script>/gi, '')</script>
它会被如下方式轻松绕过:
-
<scr>ipt>alert(1)</scr><u>ipt></u>(混淆标签名) -
<img src="x" onerror="alert(1)">(事件属性) -
@#@#@#@#@#@#@#@#@#@0(伪协议)
真正安全的做法是:使用
DOMPurify.sanitize()(前端)或bleach.clean()(Python)、OWASP Java HTML Sanitizer(Java)等专用库,它们基于真实 HTML 解析树进行白名单过滤。正则能做的,是辅助性的、面向已知简单模式的预处理;一旦涉及标签层级、属性上下文、实体解码或浏览器实际渲染行为,就必须交给 HTML 解析器。这点容易被忽略,但恰恰是 XSS 防御成败的关键分界线。
- 邮箱:










