当前位置:  开发笔记 > 编程语言 > 正文

在Javascript中等效的HtmlSpecialChars?

如何解决《在Javascript中等效的HtmlSpecialChars?》经验,为你挑选了7个好方法。

显然,这比我想象的要难得多.它甚至如此简单......

是否有一个功能相当于PHP的内置于Javascript的htmlspecialchars?我知道自己实现起来相当容易,但使用内置函数(如果可用)更好.

对于那些不熟悉PHP,用htmlspecialchars转换这样的东西进入<htmltag/>

我知道,escape()并且encodeURI()不以这种方式工作.



1> Kip..:

您的解决方案代码存在问题 - 它只会逃避每个特殊字符的第一次出现.例如:

escapeHtml('Kip\'s evil "test" code\'s here');
Actual:   Kip's <b>evil "test" code's here
Expected: Kip's <b>evil</b> "test" code's here

这是正常运行的代码:

function escapeHtml(text) {
  return text
      .replace(/&/g, "&")
      .replace(//g, ">")
      .replace(/"/g, """)
      .replace(/'/g, "'");
}

更新

以下代码将产生与上述相同的结果,但它表现更好,特别是在大块文本上(感谢jbo5112).

function escapeHtml(text) {
  var map = {
    '&': '&',
    '<': '<',
    '>': '>',
    '"': '"',
    "'": '''
  };

  return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}


使用单个替换和映射功能更快,单个替换更好.(http://jsperf.com/escape-html-special-chars/11)
关于这个函数的好处是它在node.js中工作,默认情况下没有dom
@RadekMatěj即使在这种情况下,当在HTML文档中使用时,两个&符号都被编码,这是完全有效的(我更愿意争辩).我仍然认为这是插件的错误.

2> o.k.w..:

这是HTML编码.没有原生的javascript函数可以做到这一点,但你可以google并获得一些很好的完成.

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

编辑:
这是我测试过的:

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

输出: <htmltag/>



3> Chris Jacob..:

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

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

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


这应该是公认的最高投票答案.我不确定为什么没有选票.对于jsperf(http://jsperf.com/escape-html-special-chars/11)的长期(326KB谷歌搜索结果)和短输入字符串,这是最快的基准测试.请投票.

4> Alexander Ya..:

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

var escapedValue = $('
').text(value).html();

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

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


我发现的东西:双引号和单引号保持原样.如果要在属性值中使用它,则会出现问题.
人们如何对这个答案投票:答案有jquery:+1 - 不会逃脱单引号和双引号:ummmm ..(抓头).. + 1.``**这个答案应该有NEGATIVE分数,因为它甚至不会接近回答问题"HtmlSpecialChars等效".**``它 - 不 - 不逃避引号 - 耶稣 - 基督和其他-神灵.**OMG**你jquery人.

5> Dan Bray..:

这是一个转义HTML的函数:

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

并解码:

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



6> mer10z_tech..:

Underscore.js为此提供了一个函数:

_.escape(string)

转义字符串以插入HTML,替换&,<,>,"和"字符.

http://underscorejs.org/#escape

它不是一个内置的Javascript函数,但是如果你已经在使用Underscore,那么如果要转换的字符串不是太大,那么它是一个比编写自己的函数更好的选择.



7> Fredric..:

另一个目的是完全放弃所有字符映射,而是将所有不需要的字符转换为它们各自的数字字符引用,例如:

function escapeHtml(raw) {
    return raw.replace(/[&<>"']/g, function onReplace(match) {
        return '&#' + match.charCodeAt(0) + ';';
    });
}

请注意,指定的RegEx仅处理OP要转义的特定字符,但是,根据将要使用转义的HTML的上下文,这些字符可能不够.Ryan Grove的文章除了&,<,>之外还有更多的HTML转义,并且"对这个主题是一个很好的阅读.根据你的上下文,为了避免XSS注入,可能需要以下RegEx:

var regex = /[&<>"'` !@$%()=+{}[\]]/g

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有