去除 HTML 标签:能得到什么、会丢什么
从网页源码或富文本导出里复制的内容混着一堆标签,去掉之后剩下的才是能贴进纯文本环境的段落。
什么场景真的需要它
把网页正文复制到纯文本环境时最常见:邮件、Word、工单系统、翻译文件都只需要文字。富文本编辑器导出的内容、HTML 格式的邮件模板,也常要先清理再用。直接复制整页时,导航和广告也会一起粘进来,先确认范围。
另一种用途是比对。两份带标签的 HTML 直接 diff 会满屏都是属性差异,先把标签去掉再比,看到的才是文字内容的增减。批量整理时也常这样粗清理一遍,但建议保留一份原始 HTML,方便回查。
规则很简单,坑也在这里
它只删除尖括号包住的那一段,标签之间的文字保留,标签属性随之消失,所以链接地址不会留下。字符实体不会被解码:& 仍然是 &, 仍然是一个实体,需要另外处理。
script 和 style 里的内容会留在结果中,因为删除的是标签而不是内部文字,这是最容易踩的坑。正文里写成 a < b > c 的比较式也会被当成标签删掉,未闭合的尖括号可能吃掉后面一大段。处理后请逐一检查这三处。
- 字符实体原样保留,需要另行解码
- 脚本和样式的内容会残留
- 正文里的尖括号可能被误删
替代方案与安全边界
要提取正文、去掉导航和广告,用浏览器的阅读模式或 Readability 一类工具;要保留链接文字和地址,用 DOM 解析逐个节点取值,而不是整体删标签。输入不规整时,浏览器的 HTML 解析器比正则更可靠。
绝对不要把它当安全过滤。删除标签不等于转义,残留的实体和文本仍可能被解释成标记,攻击面并没有消除。防 XSS 要在输出时按上下文转义、用白名单清洗,并在服务端生成 HTML。
常见问题
为什么结果里还留着 & 这样的字符?
因为工具只删除标签,不解码字符实体。& 在 HTML 里代表 &,但在这里会被原样保留。需要真正还原时,请另用实体解码工具或脚本处理。
为什么脚本代码还在结果里?
删除的是 script 标签本身,标签之间的内容不属于标签,所以会留下。需要去掉时,应先用能解析 DOM 的工具删除整个 script 节点,而不是只删标签。
可以用它来防止 XSS 吗?
不能。删除标签不是转义,残留内容仍可能被浏览器解释执行。防 XSS 要在输出时按上下文转义、使用白名单清洗,并在服务端生成 HTML。
相关工具:去除 HTML 标签