在Javascript中将特殊字符转换为HTML

Jin*_*ong 112 javascript

是否有任何人知道如何特殊字符转换为HTMLJavascript

例:

  • &(&符号)变成了&amp.
  • "(双引号)成为&quotENT_NOQUOTES未设置.
  • '(单引号)&#039仅在ENT_QUOTES设置时才变为.
  • <(小于)成为&lt.
  • >(大于)成为&gt.

Cer*_*rus 204

在我看来,最好的方法是使用浏览器的内置HTML转义功能来处理许多情况.要做到这一点,只需在DOM树中创建一个元素,并将元素设置innerText为您的字符串.然后检索innerHTML元素.浏览器将返回HTML编码的字符串.

function HtmlEncode(s)
{
  var el = document.createElement("div");
  el.innerText = el.textContent = s;
  s = el.innerHTML;
  return s;
}
Run Code Online (Sandbox Code Playgroud)

测试运行:

alert(HtmlEncode('&;\'><"'));
Run Code Online (Sandbox Code Playgroud)

输出:

&amp;;'&gt;&lt;"
Run Code Online (Sandbox Code Playgroud)

这种转义HTML的方法也被Prototype JS库使用,但与我给出的简单示例不同.

注意:您仍然需要自己转义引号(双引号和单引号).您可以在此处使用其他人概述的任何方法.

  • 使用jQuery,`output = $('<div>').text(input).html()` (20认同)
  • 两种方法都不会将'转换为' 和"进入"所以它仍然可以用于XSS攻击. (5认同)
  • 注意`删除el`在这里是个错误.http://perfectionkills.com/understanding-delete/ (3认同)
  • 抱歉,我正在使用奇怪的字符进行测试,而且 Chrome 很狡猾,不会向您显示真正的 HTML 输出,但 Firebug 会显示(实际上,当生成的源代码未对其进行编码时,它会显示版权符号的 html 实体)。这在 `&lt;&gt;&amp;` 上确实工作得很好,但不像 Neotropic 或 KooiInc 的解决方案那么全面。 (2认同)

Ste*_*ven 70

你需要一个像这样的功能

return mystring.replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
Run Code Online (Sandbox Code Playgroud)

但考虑到您对单/双引号的不同处理的愿望.

  • 正则表达式中的@JohnnyBizzle`/g`表示"全局".简单地说,所有出现的字符串都将被替换.没有`/ g`只会替换第一个匹配. (4认同)

Koo*_*Inc 31

此通用函数将每个非字母字符编码为其htmlcode(数字):

function HTMLEncode(str) {
    var i = str.length,
        aRet = [];

    while (i--) {
        var iC = str[i].charCodeAt();
        if (iC < 65 || iC > 127 || (iC>90 && iC<97)) {
            aRet[i] = '&#'+iC+';';
        } else {
            aRet[i] = str[i];
        }
    }
    return aRet.join('');
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*son 19

创建一个使用字符串的函数 replace

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


小智 19

来自Mozilla ......

请注意,charCodeAt将始终返回小于65,536的值.这是因为较高的代码点由一对(较低值)"代理"伪字符表示,这些伪字符用于构成真实字符.因此,为了检查或重现值为65,536及以上的单个字符的完整字符,对于这些字符,不仅需要检索charCodeAt(i),还需要检索charCodeAt(i + 1)(就像检查一样) /再现一个带有两个>字母的字符串).

最佳解决方案

/**
 * (c) 2012 Steven Levithan <http://slevithan.com/>
 * MIT license
 */
if (!String.prototype.codePointAt) {
    String.prototype.codePointAt = function (pos) {
        pos = isNaN(pos) ? 0 : pos;
        var str = String(this),
            code = str.charCodeAt(pos),
            next = str.charCodeAt(pos + 1);
        // If a surrogate pair
        if (0xD800 <= code && code <= 0xDBFF && 0xDC00 <= next && next <= 0xDFFF) {
            return ((code - 0xD800) * 0x400) + (next - 0xDC00) + 0x10000;
        }
        return code;
    };
}

/**
 * Encodes special html characters
 * @param string
 * @return {*}
 */
function html_encode(string) {
    var ret_val = '';
    for (var i = 0; i < string.length; i++) { 
        if (string.codePointAt(i) > 127) {
            ret_val += '&#' + string.codePointAt(i) + ';';
        } else {
            ret_val += string.charAt(i);
        }
    }
    return ret_val;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

html_encode("?");
Run Code Online (Sandbox Code Playgroud)


小智 7

function char_convert() {

    var chars = ["©","Û","®","ž","Ü","Ÿ","Ý","$","Þ","%","¡","ß","¢","à","£","á","À","¤","â","Á","¥","ã","Â","¦","ä","Ã","§","å","Ä","¨","æ","Å","©","ç","Æ","ª","è","Ç","«","é","È","¬","ê","É","­","ë","Ê","®","ì","Ë","¯","í","Ì","°","î","Í","±","ï","Î","²","ð","Ï","³","ñ","Ð","´","ò","Ñ","µ","ó","Õ","¶","ô","Ö","·","õ","Ø","¸","ö","Ù","¹","÷","Ú","º","ø","Û","»","ù","Ü","@","¼","ú","Ý","½","û","Þ","€","¾","ü","ß","¿","ý","à","‚","À","þ","á","ƒ","Á","ÿ","å","„","Â","æ","…","Ã","ç","†","Ä","è","‡","Å","é","ˆ","Æ","ê","‰","Ç","ë","Š","È","ì","‹","É","í","Œ","Ê","î","Ë","ï","Ž","Ì","ð","Í","ñ","Î","ò","‘","Ï","ó","’","Ð","ô","“","Ñ","õ","”","Ò","ö","•","Ó","ø","–","Ô","ù","—","Õ","ú","˜","Ö","û","™","×","ý","š","Ø","þ","›","Ù","ÿ","œ","Ú"]; 
    var codes = ["&copy;","&#219;","&reg;","&#158;","&#220;","&#159;","&#221;","&#36;","&#222;","&#37;","&#161;","&#223;","&#162;","&#224;","&#163;","&#225;","&Agrave;","&#164;","&#226;","&Aacute;","&#165;","&#227;","&Acirc;","&#166;","&#228;","&Atilde;","&#167;","&#229;","&Auml;","&#168;","&#230;","&Aring;","&#169;","&#231;","&AElig;","&#170;","&#232;","&Ccedil;","&#171;","&#233;","&Egrave;","&#172;","&#234;","&Eacute;","&#173;","&#235;","&Ecirc;","&#174;","&#236;","&Euml;","&#175;","&#237;","&Igrave;","&#176;","&#238;","&Iacute;","&#177;","&#239;","&Icirc;","&#178;","&#240;","&Iuml;","&#179;","&#241;","&ETH;","&#180;","&#242;","&Ntilde;","&#181;","&#243;","&Otilde;","&#182;","&#244;","&Ouml;","&#183;","&#245;","&Oslash;","&#184;","&#246;","&Ugrave;","&#185;","&#247;","&Uacute;","&#186;","&#248;","&Ucirc;","&#187;","&#249;","&Uuml;","&#64;","&#188;","&#250;","&Yacute;","&#189;","&#251;","&THORN;","&#128;","&#190;","&#252","&szlig;","&#191;","&#253;","&agrave;","&#130;","&#192;","&#254;","&aacute;","&#131;","&#193;","&#255;","&aring;","&#132;","&#194;","&aelig;","&#133;","&#195;","&ccedil;","&#134;","&#196;","&egrave;","&#135;","&#197;","&eacute;","&#136;","&#198;","&ecirc;","&#137;","&#199;","&euml;","&#138;","&#200;","&igrave;","&#139;","&#201;","&iacute;","&#140;","&#202;","&icirc;","&#203;","&iuml;","&#142;","&#204;","&eth;","&#205;","&ntilde;","&#206;","&ograve;","&#145;","&#207;","&oacute;","&#146;","&#208;","&ocirc;","&#147;","&#209;","&otilde;","&#148;","&#210;","&ouml;","&#149;","&#211;","&oslash;","&#150;","&#212;","&ugrave;","&#151;","&#213;","&uacute;","&#152;","&#214;","&ucirc;","&#153;","&#215;","&yacute;","&#154;","&#216;","&thorn;","&#155;","&#217;","&yuml;","&#156;","&#218;"];

    for(x=0; x<chars.length; x++){
        for (i=0; i<arguments.length; i++){
            arguments[i].value = arguments[i].value.replace(chars[x], codes[x]);
        }
    }
 }

char_convert(this);
Run Code Online (Sandbox Code Playgroud)


小智 6

function ConvChar( str ) {
  c = {'<':'&lt;', '>':'&gt;', '&':'&amp;', '"':'&quot;', "'":'&#039;',
       '#':'&#035;' };
  return str.replace( /[<&>'"#]/g, function(s) { return c[s]; } );
}

alert( ConvChar('<-"-&-"->-<-\'-#-\'->') );

结果:

&lt;-&quot;-&amp;-&quot;-&gt;-&lt;-&#039;-&#035;-&#039;-&gt;

在testarea标签:

<-"-&-"->-<-'-#-'->

如果你只是改变长代码中的一个小字符......


Joh*_*ers 6

如果您需要支持所有标准化命名字符引用Unicode不明确的 & 符号库是我所知道的唯一 100% 可靠的解决方案!

\n
\n

使用示例

\n
he.encode(\'foo \xc2\xa9 bar \xe2\x89\xa0 baz  qux\');\n// Output: \'foo &#xA9; bar &#x2260; baz &#x1D306; qux\'\n\nhe.decode(\'foo &copy; bar &ne; baz &#x1D306; qux\');\n// Output: \'foo \xc2\xa9 bar \xe2\x89\xa0 baz  qux\'\n
Run Code Online (Sandbox Code Playgroud)\n


Chr*_*ras 6

对于那些想要像字符串内部那样解码整数字符代码的人&#xxx;,请使用以下函数:

function decodeHtmlCharCodes(str) { 
  return str.replace(/(&#(\d+);)/g, function(match, capture, charCode) {
    return String.fromCharCode(charCode);
  });
}

// Will output "The show that gained int’l reputation’!"
console.log(decodeHtmlCharCodes('The show that gained int&#8217;l reputation&#8217;!'));
Run Code Online (Sandbox Code Playgroud)

ES6

const decodeHtmlCharCodes = str => 
  str.replace(/(&#(\d+);)/g, (match, capture, charCode) => 
    String.fromCharCode(charCode));

// Will output "The show that gained int’l reputation’!"
console.log(decodeHtmlCharCodes('The show that gained int&#8217;l reputation&#8217;!'));
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,因为这将解码所有内容。 (3认同)

Ser*_*gan 5

正如dragon最干净的方法提到的是jQuery

function HtmlEncode(s) {
    return $('<div>').text(s).html();
}

function HtmlDecode(s) {
    return $('<div>').html(s).text();
}
Run Code Online (Sandbox Code Playgroud)