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

IT技术 javascript
2021-01-23 07:35:04

有谁知道如何将特殊字符转换为HTMLin Javascript

例子:

  • &(&) 变成&amp.
  • "(双引号)未设置&quot变为ENT_NOQUOTES
  • '(单引号)&#039仅在ENT_QUOTES设置变为
  • <(小于)变成&lt
  • >(大于)变成&gt
6个回答

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

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

测试运行:

alert(HtmlEncode('&;\'><"'));

输出:

&amp;;'&gt;&lt;"

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

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

抱歉,我正在用奇怪的字符进行测试,而且 Chrome 是偷偷摸摸的,不会向您显示真正的 HTML 输出,但 Firebug 会(实际上,当生成的源代码未对其进行编码时,它显示了版权符号的 html 实体)。这确实可以正常工作,<>&但不像 Neotropic 或 KooiInc 的解决方案那样全面。
2021-03-12 07:35:04
使用 jQuery, output = $('<div>').text(input).html()
2021-03-27 07:35:04
两种方法都不会将 ' 转换为 和“进入”所以它仍然可以用于XSS攻击。
2021-03-29 07:35:04
请注意,这delete el是一个错误。Perfectionkills.com/understanding-delete
2021-03-31 07:35:04
当我尝试时,这对我没有任何作用。我让字符恢复原状。
2021-04-09 07:35:04

你需要一个函数来做类似的事情

return mystring.replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");

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

2021-03-21 07:35:04
斜线g有什么作用?
2021-03-24 07:35:04
@JohnnyBizzle/g在正则表达式中的意思是“全局”。简单地说,所有出现的字符串都将被替换。没有/g只有第一场比赛将被替换。
2021-04-02 07:35:04

此通用函数将每个非字母字符编码为其 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('');
}
虚拟机。它在控制台中运行良好,但是当您输出到浏览器时,它看起来好像没有转换过东西。这是怎么回事?
2021-03-19 07:35:04
您可能会考虑更改它以从 str 中删除类似数组的访问。IE7 及以下版本不支持该功能,您可以使用 i 作为参数,直接从 str 中轻松调用 charCodeAt 。var iC = str.charCodeAt(i)
2021-04-05 07:35:04
这听起来很聪明,但我只能得到它来转换基础知识: <>&
2021-04-06 07:35:04
此代码未为 ± 字符生成正确的 HTML 实体值,该值应为 ± 但它正在返回 � 这是一个未知字符 。
2021-04-06 07:35:04
@Moss:浏览器将 htmlencoded 字符呈现为它们所代表的字符。html 编码字符的优点是浏览器不必猜测(例如)变音字符的翻译,因此总是像它们应该呈现的那样呈现这些字符。
2021-04-07 07:35:04

对于那些想要解码&#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;!'));

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;!'));

这是我一直在寻找的答案。谢谢。
2021-03-24 07:35:04
这应该是公认的答案,因为这将解码所有内容。
2021-04-08 07:35:04

从 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;
}

用法示例:

html_encode("✈");