如何在JavaScript中将特殊字符转换为HTML?
示例:
&
(与号)变成&
。"
(双引号)在未设置ENT_NOQUOTES
时变成"
。'
(单引号)仅在设置ENT_QUOTES
时变成'
。<
(小于号)变成<
。>
(大于号)变成>
。
如何在JavaScript中将特殊字符转换为HTML?
示例:
&
(与号)变成 &
。"
(双引号)在未设置ENT_NOQUOTES
时变成 "
。'
(单引号)仅在设置ENT_QUOTES
时变成'
。<
(小于号)变成 <
。>
(大于号)变成 >
。我认为最好的方法是使用浏览器内置的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('&;\'><"'));
输出:
&;'><"
这种转义HTML的方法也被Prototype JS库使用,但与我所提供的简单示例略有不同。
注意:您仍然需要自己转义引号(双引号和单引号)。您可以使用其他人在此处概述的任何方法。
delete el
是一个错误。详见 http://perfectionkills.com/understanding-delete/ 。 - gblazex<>&
上确实可以正常工作,但不像Neotropic或KooiInc的解决方案那样全面。 - Mossoutput = $('<div>').text(input).html()
。 - dragon您需要一个类似于以下功能的函数:
return mystring.replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """);
但是考虑到您对单引号/双引号有不同的处理要求。
/g
的意思是“全局”的。简单来说,所有字符串的出现都将被替换。如果没有/g
,只有第一次匹配会被替换。 - Kevin G.如果您想解码字符串中的整数字符代码,例如&#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’l reputation’!'));
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’l reputation’!'));
&#xxx;
inside a string" 的开头已经很清楚地表明了这些函数是用于解码整数编码的;如果你想要解码命名编码,这里还有很多其他函数可以做到。 - Christos Lytras此通用函数将每个非字母字符编码为其HTML代码(数字字符参考(NCR)):
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('');
}
[编辑于2022年] 更现代的方法:
const toHtmlEntities = (str, showInHtml = false) =>
[...str].map( v => `${showInHtml ? `&#` : `&#`}${v.charCodeAt(0)};`).join(``);
const str = `&Hellõ Wórld`;
document.body.insertAdjacentHTML(`beforeend`, `<ul>
<li>Show the entities (<code>toHtmlEntities(str, true)</code>): <b>${
toHtmlEntities(str, true)}</b></li>
<li>Let the browser decide (<code>toHtmlEntities(str)</code>): <b>${
toHtmlEntities(str)}</b></li>
<li id="textOnly"></li></ul>`);
document.querySelector(`#textOnly`).textContent = `As textContent: ${
toHtmlEntities(str)}`;
body {
font: 14px / 18px "normal verdana", arial;
margin: 1rem;
}
code {
background-color: #eee;
}
<>&
。 - Mossvar iC = str.charCodeAt(i)
- Chasereplace
的函数。function convert(str)
{
str = str.replace(/&/g, "&");
str = str.replace(/>/g, ">");
str = str.replace(/</g, "<");
str = str.replace(/"/g, """);
str = str.replace(/'/g, "'");
return str;
}
从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("✈");
function char_convert() {
var chars = ["©","Û","®","ž","Ü","Ÿ","Ý","$","Þ","%","¡","ß","¢","à","£","á","À","¤","â","Á","¥","ã","Â","¦","ä","Ã","§","å","Ä","¨","æ","Å","©","ç","Æ","ª","è","Ç","«","é","È","¬","ê","É","","ë","Ê","®","ì","Ë","¯","í","Ì","°","î","Í","±","ï","Î","²","ð","Ï","³","ñ","Ð","´","ò","Ñ","µ","ó","Õ","¶","ô","Ö","·","õ","Ø","¸","ö","Ù","¹","÷","Ú","º","ø","Û","»","ù","Ü","@","¼","ú","Ý","½","û","Þ","€","¾","ü","ß","¿","ý","à","‚","À","þ","á","ƒ","Á","ÿ","å","„","Â","æ","…","Ã","ç","†","Ä","è","‡","Å","é","ˆ","Æ","ê","‰","Ç","ë","Š","È","ì","‹","É","í","Œ","Ê","î","Ë","ï","Ž","Ì","ð","Í","ñ","Î","ò","‘","Ï","ó","’","Ð","ô","“","Ñ","õ","”","Ò","ö","•","Ó","ø","–","Ô","ù","—","Õ","ú","˜","Ö","û","™","×","ý","š","Ø","þ","›","Ù","ÿ","œ","Ú"];
var codes = ["©","Û","®","ž","Ü","Ÿ","Ý","$","Þ","%","¡","ß","¢","à","£","á","À","¤","â","Á","¥","ã","Â","¦","ä","Ã","§","å","Ä","¨","æ","Å","©","ç","Æ","ª","è","Ç","«","é","È","¬","ê","É","­","ë","Ê","®","ì","Ë","¯","í","Ì","°","î","Í","±","ï","Î","²","ð","Ï","³","ñ","Ð","´","ò","Ñ","µ","ó","Õ","¶","ô","Ö","·","õ","Ø","¸","ö","Ù","¹","÷","Ú","º","ø","Û","»","ù","Ü","@","¼","ú","Ý","½","û","Þ","€","¾","ü","ß","¿","ý","à","‚","À","þ","á","ƒ","Á","ÿ","å","„","Â","æ","…","Ã","ç","†","Ä","è","‡","Å","é","ˆ","Æ","ê","‰","Ç","ë","Š","È","ì","‹","É","í","Œ","Ê","î","Ë","ï","Ž","Ì","ð","Í","ñ","Î","ò","‘","Ï","ó","’","Ð","ô","“","Ñ","õ","”","Ò","ö","•","Ó","ø","–","Ô","ù","—","Õ","ú","˜","Ö","û","™","×","ý","š","Ø","þ","›","Ù","ÿ","œ","Ú"];
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);
function ConvChar(str) {
c = {'<':'&lt;', '>':'&gt;', '&':'&amp;',
'"':'&quot;', "'":'&#039;', '#':'&#035;' };
return str.replace(/[<&>'"#]/g, function(s) { return c[s]; });
}
alert(ConvChar('<-"-&-"->-<-\'-#-\'->'));
结果:
<-"-&amp-"--><-'-#-'->
在testarea标签中:
<-"-&-"->-<'-#-'->
如果您只需要更改长代码中的几个字符...
he.encode('foo © bar ≠ baz qux');
// Output: 'foo © bar ≠ baz 𝌆 qux'
he.decode('foo © bar ≠ baz 𝌆 qux');
// Output: 'foo © bar ≠ baz qux'