解码& 回到&在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 & world'; var parser = new DOMParser; var dom = parser.parseFromString( '<!doctype html><body>' + encodedStr, 'text/html'); var decodedString = dom.body.textContent; console.log(decodedString);
你需要解码所有编码的HTML实体,或者只是&
本身?
如果你只需要处理&
那么你可以这样做:
var decoded = encoded.replace(/&/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({ '&' : '&', '>' : '>', '<' : '<', '"' : '"', ''' : "'" }); } 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örg & Jürgen rocked to & 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 & 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 & two & 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 & Like Mike'));
一个JavaScript解决scheme,抓住了常见的:
var map = {amp: '&', lt: '<', gt: '>', quot: '"', '#039': "'"} str = str.replace(/&([^;]+);/g, (m, c) => map[c])