HTML标签与实体字符详解:为什么直接删标签没那么简单

HTML标签和实体字符是表示格式化文本的两种不同机制,理解这两者,就能明白为什么"直接把标签删掉"并不总能得到干净的结果。

标签用来标记一个元素的开始和结束

像<p>或<strong>这样的标签,用一对开始和结束标记把内容包裹起来,告诉浏览器该如何处理它——是一个段落,还是加粗文字,还是一个链接。标签本身不包含可见文字,它们是指令,不是内容。

实体字符用来表示会破坏标记结构的字符

因为<和&这类字符在HTML里有特殊语法含义,它们不能直接写出来,而要写成实体字符——&lt;代表<,&amp;代表&,&nbsp;代表不换行空格。正确的转换需要把这些实体还原成原本的字符,而不只是简单地删掉标签。

块级元素隐含换行,行内元素不会

<div>、<p>、<li>是块级元素,视觉上会另起一行;而<span>、<a>、<strong>是行内元素,停留在同一行文字之中。如果只是把所有标签统一删掉而不在块级元素原来的位置补上换行,原本分段的文字就会被粘连成一整行。

人们通常出于这些原因需要去除标签

把从网页复制的富文本粘贴到纯文本输入框、表格单元格,或是无法渲染标记语言的系统里,经常会带入肉眼看不见的HTML格式,如果不事先干净地去除,就会显示成乱码或多余的符号。

去除可见标签不等于让内容变安全

用正则表达式匹配<标签>模式来删除,面对没有正确闭合、层层嵌套或刻意混淆的标记很容易失效;而清理显示格式和防止脚本注入(净化处理)完全是两回事——涉及安全的场景需要专门的净化库,而不是一段简单的标签删除逻辑。

实体字符存在的根本原因

HTML用少数几个字符(比如<和&)作为语法符号,浏览器一旦在原始文本里看到<,就会认为一个标签开始了。实体字符让文档可以安全地把这些字符作为可见文本包含进来,而不是当作标记指令解析,这也是为什么"提取纯文本"要做对,就必须把它们还原成正常字符。

简单粗暴地删标签会在哪里出问题

真实世界里的HTML很少像教科书例子那样干净——未闭合的标签、被复制粘贴打断的标签、注释或脚本块中出现的并非真正标签的尖括号,这些都会让简单的查找替换方式失效。使用真正的HTML解析器,而不是模式匹配,才能正确处理这些边界情况。

常见问题

把链接里的标签删掉,链接地址会不会也丢失?

在大多数简单处理方式下会丢失。可见的链接文字会保留下来,但标签所携带的跳转地址(href)会随着标签一起消失,因为这部分信息本来就不属于可见文本的一部分。

去除HTML标签和出于安全目的的净化处理是一回事吗?

不是。去除标签的目标是为了展示或存储得到干净的纯文本,而净化处理的目标是防止恶意代码被执行,通常需要使用经过充分测试的专用库,而不是一段简单的删标签脚本。