如何在javascript中转义一些html?

Mic*_*cah 25 javascript html-encode

鉴于文字

<b>This is some text</b>
Run Code Online (Sandbox Code Playgroud)

我想把它写到我的页面,以便它显示如下:

<b>This is some text</b>

而不是这样

这是一些文字

使用escape("<b>This is some text</b>")在firefox中给我这个可爱的宝石

%3Cb%3EThis%20is%20some%20text%3C/b%3E
Run Code Online (Sandbox Code Playgroud)

不是我所追求的.有任何想法吗?

lim*_*imc 58

这应该对你有用:http://blog.nickburwell.com/2011/02/escape-html-tags-in-javascript.html

function escapeHTML( string )
{
    var pre = document.createElement('pre');
    var text = document.createTextNode( string );
    pre.appendChild(text);
    return pre.innerHTML;
}
Run Code Online (Sandbox Code Playgroud)

安全警告

该函数不会转义单引号和双引号,如果在错误的上下文中使用,可能仍然会导致XSS.例如:

 var userWebsite = '" onmouseover="alert(\'gotcha\')" "';
 var profileLink = '<a href="' + escapeHtml(userWebsite) + '">Bob</a>';
 var div = document.getElemenetById('target');
 div.innerHtml = profileLink;
 // <a href="" onmouseover="alert('gotcha')" "">Bob</a>
Run Code Online (Sandbox Code Playgroud)

感谢缓冲区指出这种情况.从这篇博文中摘取的片段.

  • 哇,很好的解决方案,人们应该注意到这一点,并投票更多! (2认同)
  • 尽管它确实对DOM有依赖性,但这是一个很好的解决方案。如果在浏览器之外使用JavaScript,则需要以下其他解决方案之一。 (2认同)
  • 它不会转义引号,您可能会错误地认为将内容作为HTML插入是安全的.示例:http://benv.ca/2012/10/2/you-are-probably-misusing-DOM-text-methods/ (2认同)
  • limc,请使用**安全**解决方案进行更新。我现在对其进行了投票,因为它令人恐惧的人们可能正在实施它-当我看到您更新了您的答案时,我将进行投票,然后进行投票。谢谢! (2认同)

小智 28

我最终这样做了:

function escapeHTML(s) { 
    return s.replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
}
Run Code Online (Sandbox Code Playgroud)

  • 这与 kapa/Headshota 在您一年多之前发布的答案相同,-1 表示复制他们的答案。(添加缩进应该是一种编辑,而不是为自己承担后果。) (2认同)

Ste*_*uan 17

对于HTML DOM文档可用的情况,我喜欢@limc的答案.

我喜欢@Michele Bosi和@Paolo对非HTML DOM文档环境(如Node.js)的回答.

@Michael Bosi的答案可以通过单次调用替换和巧妙的替换函数来消除调用替换4次的需要进行优化:

function escape(s) {
    let lookup = {
        '&': "&amp;",
        '"': "&quot;",
        '<': "&lt;",
        '>': "&gt;"
    };
    return s.replace( /[&"<>]/g, (c) => lookup[c] );
}
console.log(escape("<b>This is some text.</b>"));
Run Code Online (Sandbox Code Playgroud)

@ Paolo的范围测试可以通过精心选择的正则表达式进行优化,并且可以通过使用替换函数来消除for循环:

function escape(s) {
    return s.replace(
        /[^0-9A-Za-z ]/g,
        c => "&#" + c.charCodeAt(0) + ";"
    );
}
console.log(escape("<b>This is some text</b>"));
Run Code Online (Sandbox Code Playgroud)

正如@Paolo所指出的,这种策略适用于更多场景.

  • 伙计们,如果您想要完整的解决方案,请移至:https://github.com/janl/mustache.js/blob/master/mustache.js#L55 它包括所有字符!感谢@Error 指出了引导我找到该方法的文章 (2认同)
  • 第二种非常适合没有 DOM 的 NodeJS;但是,我会将其扩展为不包含许多其他常见字符。通过对要跳过的正则表达式字符列表中没有的所有内容进行编码,它还可以与 HTML 规范中的任何新的特殊添加内容最好地兼容。 (2认同)

Hea*_*ota 7

试试这个htmlentities for javascript

function htmlEntities(str) {
    return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
Run Code Online (Sandbox Code Playgroud)