解码& 回到&在JavaScript中

我有类似的string

var str = 'One & two & three'; 

由Web服务器呈现为HTML。 我需要把这些string转换成

 'One & two & three' 

目前,这就是我正在做的(在jQuery的帮助下):

 $(document.createElement('div')).html('{{ driver.person.name }}').text() 

然而,我有一个令人不安的感觉,我做错了。 我努力了

 unescape("&") 

但似乎并不奏效,decodeURI / decodeURIComponent也不行。

还有没有其他的,更原生和优雅的方式呢?

从JavaScript解释HTML(文本和其他)的更现代的select是DOMParser API中的HTML支持( 请参阅MDN中的这里 )。 这使您可以使用浏览器的本机HTMLparsing器将string转换为HTML文档。 自2014年底以来,它在所有主stream浏览器的新版本中得到了支持。

如果我们只是想解码一些文本内容,我们可以把它作为文档体中的唯一内容,parsing文档,并将其.body.textContent

 var encodedStr = 'hello &amp; world'; var parser = new DOMParser; var dom = parser.parseFromString( '<!doctype html><body>' + encodedStr, 'text/html'); var decodedString = dom.body.textContent; console.log(decodedString); 

你需要解码所有编码的HTML实体,或者只是&amp; 本身?

如果你只需要处理&amp; 那么你可以这样做:

 var decoded = encoded.replace(/&amp;/g, '&'); 

如果你需要解码所有的HTML实体,那么你可以不使用jQuery:

 var elem = document.createElement('textarea'); elem.innerHTML = encoded; var decoded = elem.value; 

请注意Mark的评论,其中突出显示了此答案的早期版本中的安全漏洞,并build议使用textarea而不是div来缓解潜在的XSS漏洞。 无论您使用jQuery还是纯JavaScript,这些漏洞都存在。

 var htmlEnDeCode = (function() { var charToEntityRegex, entityToCharRegex, charToEntity, entityToChar; function resetCharacterEntities() { charToEntity = {}; entityToChar = {}; // add the default set addCharacterEntities({ '&amp;' : '&', '&gt;' : '>', '&lt;' : '<', '&quot;' : '"', '&#39;' : "'" }); } function addCharacterEntities(newEntities) { var charKeys = [], entityKeys = [], key, echar; for (key in newEntities) { echar = newEntities[key]; entityToChar[key] = echar; charToEntity[echar] = key; charKeys.push(echar); entityKeys.push(key); } charToEntityRegex = new RegExp('(' + charKeys.join('|') + ')', 'g'); entityToCharRegex = new RegExp('(' + entityKeys.join('|') + '|&#[0-9]{1,5};' + ')', 'g'); } function htmlEncode(value){ var htmlEncodeReplaceFn = function(match, capture) { return charToEntity[capture]; }; return (!value) ? value : String(value).replace(charToEntityRegex, htmlEncodeReplaceFn); } function htmlDecode(value) { var htmlDecodeReplaceFn = function(match, capture) { return (capture in entityToChar) ? entityToChar[capture] : String.fromCharCode(parseInt(capture.substr(2), 10)); }; return (!value) ? value : String(value).replace(entityToCharRegex, htmlDecodeReplaceFn); } resetCharacterEntities(); return { htmlEncode: htmlEncode, htmlDecode: htmlDecode }; })(); 

这是来自ExtJS源代码。

Matthias Bynens有一个这样的库: https : //github.com/mathiasbynens/he

例:

 console.log( he.decode("J&#246;rg &amp J&#xFC;rgen rocked to &amp; fro ") ); // Logs "Jörg & Jürgen rocked to & fro" 

我build议通过黑客入侵,包括设置元素的HTML内容,然后回读其文本内容。 这样的方法可以工作,但是看起来很危险,并且如果用在不可信的用户input上,则呈现XSS机会。

如果你真的忍不住加载一个库,你可以使用这个答案中描述的textarea hack来创build一个近似重复的问题,与已经提出的各种类似的方法不同,它没有我所知道的安全漏洞:

 function decodeEntities(encodedString) { var textArea = document.createElement('textarea'); textArea.innerHTML = encodedString; return textArea.value; } console.log(decodeEntities('1 &amp; 2')); // '1 & 2' 

但请注意安全问题,影响类似的方法,我列出链接的答案! 这种方法是一种黑客行为,未来对textarea允许的内容(或特定浏览器中的bug)的更改可能导致依赖于它的代码突然有一天会出现XSS漏洞。

element.innerText也有窍门。

首先在body的某个地方创build一个<span id="decodeIt" style="display:none;"></span>

接下来,将要解码的string作为innerHTML分配给:

 document.getElementById("decodeIt").innerHTML=stringtodecode 

最后,

 stringtodecode=document.getElementById("decodeIt").innerText 

以下是整体代码:

 var stringtodecode="<B>Hello</B> world<br>"; document.getElementById("decodeIt").innerHTML=stringtodecode; stringtodecode=document.getElementById("decodeIt").innerText 

jQuery将会为你编码和解码。 但是,您需要使用textarea标记,而不是div。

 var str1 = 'One & two & three'; var str2 = "One &amp; two &amp; three"; $(document).ready(function() { $("#encoded").text(htmlEncode(str1)); $("#decoded").text(htmlDecode(str2)); }); function htmlDecode(value) { return $("<textarea/>").html(value).text(); } function htmlEncode(value) { return $('<textarea/>').text(value).html(); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <div id="encoded"></div> <div id="decoded"></div> 

对于单线家伙:

 const htmlDecode = innerHTML => Object.assign(document.createElement('textarea'), {innerHTML}).value; console.log(htmlDecode('Complicated - Dimitri Vegas &amp; Like Mike')); 

一个JavaScript解决scheme,抓住了常见的:

 var map = {amp: '&', lt: '<', gt: '>', quot: '"', '#039': "'"} str = str.replace(/&([^;]+);/g, (m, c) => map[c]) 

这是https://stackoverflow.com/a/4835406/2738039的反面;