我可以在 JavaScript 中转义 HTML 特殊字符吗?

IT技术 javascript html
2021-01-17 10:06:12

我想通过 JavaScript 函数将文本显示为 HTML。如何在 JavaScript 中转义 HTML 特殊字符?有API吗?

6个回答

这是一个几乎适用于所有网络浏览器的解决方案:

function escapeHtml(unsafe)
{
    return unsafe
         .replace(/&/g, "&")
         .replace(/</g, "&lt;")
         .replace(/>/g, "&gt;")
         .replace(/"/g, "&quot;")
         .replace(/'/g, "&#039;");
 }

如果您只支持现代网络浏览器(2020+),那么您可以使用新的replaceAll函数:

const escapeHtml = (unsafe) => {
    return unsafe.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&#039;');
}
为什么“'” 而不是“'” ?
2021-03-17 10:06:12
我认为replace()调用中的正则表达式是不必要的。普通的旧单字符字符串也可以。
2021-03-18 10:06:12
@jamix 您不能用原始字符串进行全局替换,而现代浏览器引擎对简单的正则表达式进行了很好的优化。
2021-03-19 10:06:12
2021-04-03 10:06:12
是否有任何标准 API 或这是唯一的方法?
2021-04-06 10:06:12

function escapeHtml(html){
  var text = document.createTextNode(html);
  var p = document.createElement('p');
  p.appendChild(text);
  return p.innerHTML;
}

// Escape while typing & print result
document.querySelector('input').addEventListener('input', e => {
  console.clear();
  console.log( escapeHtml(e.target.value) );
});
<input style='width:90%; padding:6px;' placeholder='&lt;b&gt;cool&lt;/b&gt;'>

请注意,这不会转义引号 ("'),因此如果在 HTML 标记属性中使用此函数中的字符串,它们仍然会造成损坏。
2021-03-23 10:06:12
在这里工作,但在浏览器中离线对我不起作用
2021-04-04 10:06:12

您可以使用 jQuery 的.text()函数

例如:

http://jsfiddle.net/9H6Ch/

从有关该.text()功能的 jQuery 文档

我们需要注意,此方法会根据需要对提供的字符串进行转义,以便在 HTML 中正确呈现。为此,它调用 DOM 方法 .createTextNode(),不会将字符串解释为 HTML。

以前版本的 jQuery 文档是这样表述的(强调了添加):

我们需要注意,此方法会根据需要对提供的字符串进行转义,以便在 HTML 中正确呈现。为此,它调用 DOM 方法 .createTextNode(),该方法将特殊字符替换为其 HTML 实体等效项(例如 < for <)。

请注意,这会留下引号'和未"转义的内容,这可能会让您失望
2021-03-15 10:06:12
如果您只想像这样转换,您甚至可以在新元素上使用它:const str = "foo<>'\"&"; $('<div>').text(str).html()yieldsfoo&lt;&gt;'"&amp;
2021-04-02 10:06:12

使用Lodash

_.escape('fred, barney, & pebbles');
// => 'fred, barney, &amp; pebbles'

源代码

2021-03-10 10:06:12
与此相反的是什么?与此相反的函数的名称?
2021-03-25 10:06:12

我想我找到了正确的方法来做到这一点......

// Create a DOM Text node:
var text_node = document.createTextNode(unescaped_text);

// Get the HTML element where you want to insert the text into:
var elem = document.getElementById('msg_span');

// Optional: clear its old contents
//elem.innerHTML = '';

// Append the text node into it:
elem.appendChild(text_node);
请注意,如果您尝试像这样访问文本节点的内容,则不会对其进行转义: document.createTextNode("<script>alert('Attack!')</script>").textContent
2021-03-15 10:06:12
如果您所做的只是设置文本,那么这是正确的方法。这也是 textContent 但显然它没有得到很好的支持。但是,如果您正在构建一个带有某些部分文本和一些 html 的字符串,则这将不起作用,那么您仍然需要转义。
2021-03-31 10:06:12
我真的很喜欢这个,因为它正确地使用了 DOM。与大多数其他选项相比,它感觉不那么“hacky”。
2021-04-04 10:06:12
我今天学到了一些关于 HTML 的新东西。w3schools.com/jsref/met_document_createtextnode.asp
2021-04-08 10:06:12