直接用正则去除HTML标签可行但有明显局限性,仅适用于结构简单、来源可信的纯展示文本清洗;真正安全的方式是用浏览器原生DOM解析,自动处理实体、注释、畸形HTML等,语义准确且容错性强。

直接用正则去除 HTML 标签在 JavaScript 中可行,但有明显局限性——它无法处理嵌套、注释、CDATA、属性中含 < 或 > 的情况,也不支持自闭合标签的严谨解析。仅适用于结构简单、来源可信的纯展示文本清洗(如富文本编辑器输出的轻量 HTML)。
基础写法:匹配并移除成对或单标签
最常用的是匹配以 < 开头、以 > 结尾的任意内容:
这个正则含义是:< + 任意非 > 字符([^>]*)+ >,全局替换为空字符串。
它能处理:
立即学习“Java免费学习笔记(深入)”;
-
<div>hello</div>→"hello" -
<p class="intro">Hi</p>→"Hi" -
<br/><img src="x">→ 空字符串(所有标签被清空)
稍稳妥一点:排除注释和 CDATA(仍不完美)
若 HTML 可能含注释(<!-- ... -->)或 CDATA(<![CDATA[...]]>),可先清除这些再删标签:
.replace(//g, '')
.replace(//g, '')
.replace(/]*>/g, '');
注意:[\s\S] 能匹配换行符,*? 是非贪婪模式,避免跨多行误吞内容。
真正安全的方式:用浏览器原生 DOM 解析
只要运行环境有 DOM(浏览器或 Node.js 配合 JSDOM),这是最可靠的方法:
function stripHtml(html) {if (!html || typeof html !== 'string') return '';
const div = document.createElement('div');
div.innerHTML = html;
return div.textContent || div.innerText || '';
}
优势:
- 自动处理实体(
→)、脚本/样式内容不执行、注释自动忽略 - 对畸形 HTML(如未闭合标签、属性含
<)有容错能力 - 结果语义准确,等同于用户“看到的纯文本”
Node.js 中需先安装 jsdom 并引入:
function stripHtml(html) {
const dom = new JSDOM(html);
return dom.window.document.body.textContent || '';
}
不推荐的“增强正则”误区
有人尝试写更复杂的正则来覆盖更多情况,例如:
/]*>/gi这类写法看似更精确,实则问题更多:
- 无法识别 SVG/HTML5 自定义标签(如
<my-component>) - 遇到
<script>alert('<div>')这类内容会提前截断 - 正则无法做语法树分析,本质上仍是“字符串擦除”,不是“HTML 解析”
与其花时间调正则边界,不如切换到 DOM 方案——更短、更稳、更少 bug。











