JavaScript 中的 HtmlSpecialChars 等价物是什么?

IT技术 javascript html escaping html-encode
2021-01-30 22:42:37

显然,这比我想象的更难找到。它甚至如此简单......

是否有与JavaScript 内置的PHP htmlspecialchars等效的函数我知道自己实现它相当容易,但使用内置函数(如果可用)更好。

对于那些不熟悉 PHP 的人,htmlspecialchars 将类似的内容翻译<htmltag/>&lt;htmltag/&gt;

我知道这一点escape()并且encodeURI()不会这样工作。

6个回答

您的解决方案代码有问题——它只会转义每个特殊字符的第一次出现。例如:

escapeHtml('Kip\'s <b>evil</b> "test" code\'s here');
Actual:   Kip&#039;s &lt;b&gt;evil</b> &quot;test" code's here
Expected: Kip&#039;s &lt;b&gt;evil&lt;/b&gt; &quot;test&quot; code&#039;s here

这是正常工作的代码:

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

更新

以下代码将产生与上述相同的结果,但性能更好,尤其是在大文本块上(感谢jbo5112)。

function escapeHtml(text) {
  var map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  };
  
  return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}
@RadekMatěj 即使在那种情况下,在 HTML 文档中使用时对两个 & 符号进行编码也是完全有效的(我认为最好是这样)。我仍然认为它是插件的错误。
2021-03-23 22:42:37
这将扭曲文本的URL,这使得它们无法像插件Autolinker.js有什么办法可以解决这个问题吗?
2021-03-25 22:42:37
这个函数的好处是它可以在 node.js 中工作,默认情况下它没有 dom
2021-04-01 22:42:37
@jbo5112 好点,我没有意识到 JS 允许回调进行替换。不过,这段代码更容易理解,我怀疑将 escapeHtml() 减少几毫秒是否会有所作为,除非您出于某种原因连续调用它数百次。
2021-04-01 22:42:37
使用单个替换和映射函数速度更快,并且单个替换的比例更好。( jsperf.com/escape-html-special-chars/11 )
2021-04-06 22:42:37

那就是 HTML 编码。没有原生的 javascript 函数可以做到这一点,但你可以谷歌搜索并得到一些做得很好的。

例如http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/

编辑:
这是我测试过的:

var div = document.createElement('div');
  var text = document.createTextNode('<htmltag/>');
  div.appendChild(text);
  console.log(div.innerHTML);

输出: &lt;htmltag/&gt;

您可以尝试我在帖子中包含的链接中的方法。确实很简洁的概念。
2021-03-16 22:42:37
@okw:好的,首先你链接到这个:yuki-onna.co.uk/html/encode.html,它完全做了什么encodeURIComponent,而不是 OP 所要求的。所以你可以编辑吗?我似乎无法撤消我的 -1。
2021-03-22 22:42:37
太糟糕了,我只需要使用自定义函数即可。
2021-03-26 22:42:37
@BeauCielBleu:不。创建的唯一节点是单个div元素和文本节点。创建一个带有文本` <img src=bogus onerror=alert(1337)>` 的文本节点只会创建一个文本节点,而不是一个img元素。
2021-04-02 22:42:37
是的,该页面的代码看起来合乎逻辑,但我没有对其进行测试。新链接虽然有效,但我自己已经验证过了。我已经更新了一段时间后的帖子。
2021-04-06 22:42:37

值得一读:http : //bigdingus.com/2007/12/29/html-escaping-in-javascript/

escapeHTML: (function() {
 var MAP = {
   '&': '&amp;',
   '<': '&lt;',
   '>': '&gt;',
   '"': '&#34;',
   "'": '&#39;'
 };
  var repl = function(c) { return MAP[c]; };
  return function(s) {
    return s.replace(/[&<>'"]/g, repl);
  };
})()

注意:只运行一次。并且不要在已经编码的字符串上运行它,例如&amp;变成&amp;amp;

这应该是接受和投票最高的答案。我不确定为什么它没有投票。这是在 jsperf ( jsperf.com/escape-html-special-chars/11 )上使用长(326KB 谷歌搜索结果)和短输入字符串最快的基准测试请投票。
2021-03-12 22:42:37
这与获得最高票数的答案有什么区别?。为什么要额外的内部功能?解释可以帮助用户更好地理解
2021-03-12 22:42:37

这是一个转义 HTML 的函数:

function escapeHtml(str)
{
    var map =
    {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        "'": '&#039;'
    };
    return str.replace(/[&<>"']/g, function(m) {return map[m];});
}

并解码:

function decodeHtml(str)
{
    var map =
    {
        '&amp;': '&',
        '&lt;': '<',
        '&gt;': '>',
        '&quot;': '"',
        '&#039;': "'"
    };
    return str.replace(/&amp;|&lt;|&gt;|&quot;|&#039;/g, function(m) {return map[m];});
}

使用 jQuery,它可以是这样的:

var escapedValue = $('<div/>').text(value).html();

来自相关问题使用 jQuery 转义 HTML 字符串

正如评论中提到的,双引号和单引号在此实现中保持原样。这意味着如果您需要将元素属性设为原始 html 字符串,则不应使用此解决方案。

还有其他优势吗(比如,如果你有 unicode 字符或其他东西)?
2021-03-13 22:42:37
人们如何对这个答案投票:答案有 jquery:+1 - 不会转义单引号和双引号:ummmm ..(抓头).. +1。<!-- Caps rage begin --> 这个答案应该有负分,因为它甚至无法回答“HtmlSpecialChars 等效”问题。 <!-- Caps rage end -->它不会逃避引用耶稣基督和其他神灵。天哪,你jquery的人。
2021-04-01 22:42:37
我发现了一些东西:双引号和单引号保持原样。如果您想在属性值中使用它,这会带来问题。
2021-04-03 22:42:37
知道这是否有任何开销 - 向 DOM 添加一个虚拟对象?
2021-04-05 22:42:37
对于小块文本,这需要运行所有替换的 30 倍。不过,它确实可以更好地扩展。使用像 Google 搜索结果页面 (326KB) 这样巨大的内容,它比替换或直接在 javascript 中执行此操作快 25-30%。但是,它们始终都输给了单个替换和映射函数。
2021-04-08 22:42:37