在前端开发中,经常会遇到需要从字符串中提取纯文本内容,去除所有 HTML 标签的场景。本文将探讨几种在 JavaScript 中从字符串中去除 HTML 标签的方法,并分析它们的优缺点,最终解释为什么 DOMParser API 是一个更安全、更可靠的选择。
可以通过正则表达式与 String.prototype.replace 方法来实现,代码示例如下:
function stripHtmlTags(str) {
return str.replace(/<[^>]*>/g, '');
}
这段代码通过匹配尖括号及其内部的字符并将它们替换为空字符串,从而去除 HTML 标签。
尽管这种方法简单快捷,但它有一个显著的缺点:对于复杂的或者不规则的 HTML 结构,正则表达式可能无法完全准确地匹配所有标签,导致清理不彻底或误删文本内容。
这种方法涉及创建一个临时的 DOM 元素,将字符串作为其 innerHTML,然后返回这个元素的 textContent。实现代码如下:
function stripHtmlUsingTextContent(str) {
const tempDiv = document.createElement('div');
tempDiv.innerHTML = str;
return tempDiv.textContent || tempDiv.innerText || '';
}
这种方法的主要缺点是安全风险。如果字符串包含恶意代码,例如:
let str = "<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>"
即便是不将此元素添加到文档中,当执行tempDiv.innerHTML = str 时,恶意脚本也会被执行。这就大大增加了使用这种方法的风险。
DOMParser API 提供了一种将字符串解析成真实 DOM 节点的方法,从而可以安全地访问这些节点的文本内容。以下是使用 DOMParser 去除 HTML 标签的实现:
function stripHtmlUsingDOMParser(str) {
const parser = new DOMParser();
const doc = parser.parseFromString(str, 'text/html');
return doc.body.textContent || '';
}
这种方法通过将字符串解析为一个 HTMLDocument 对象,然后访问这个对象的 body 属性的 textContent,从而获得纯文本内容,避免了直接操作字符串或 DOM 元素可能带来的安全风险。
DOMParser 的使用相对简单安全,但其处理大量数据或频繁操作时的性能相比前两种方法略有不足。
虽然使用字符串替换和HTML元素的 textContent 属性可以在某些情况下快速去除 HTML 标签,但它们各自都有缺陷,尤其是安全性问题。考虑到安全性和准确性,DOMParser API 是一个更优的选择。尽管在处理大量数据时可能性能稍微低一些,但它提供了一种更安全、更可靠的方式来去除 HTML 标签,尤其是在处理可能包含恶意代码的字符串时。因此,当安全性成为首要考虑时,应优先选择使用 DOMParser。