HtmlSpecialChars相当于Javascript?

显然,这比我想象的要难得多。 它甚至是如此简单…

有没有一个相当于PHP内置到Javascript中的htmlspecialchars的函数? 我知道你自己实现它是相当容易的,但是使用内置函数(如果可用)更好。

对于那些不熟悉PHP的人来说,htmlspecialchars将诸如<htmltag/>类的东西翻译成&lt;htmltag/&gt;

我知道escape()encodeURI()不以这种方式工作。

你的解决scheme代码有一个问题 – 它只会逃避每个特殊字符的第一个出现。 例如:

 escapeHtml('Kip\'s <b>evil</b> "test" code\'s here'); Actual: Kip&#039;s &lt;b&gt;evil</b> &quot;test" code's here Expected: Kip&#039;s &lt;b&gt;evil&lt;/b&gt; &quot;test&quot; code&#039;s here 

这里是正常工作的代码:

 function escapeHtml(text) { return text .replace(/&/g, "&amp;") .replace(/</g, "&lt;") .replace(/>/g, "&gt;") .replace(/"/g, "&quot;") .replace(/'/g, "&#039;"); } 

更新

下面的代码将产生与上述相同的结果,但它的性能更好,特别是在大块文本上(谢谢jbo5112 )。

 function escapeHtml(text) { var map = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#039;' }; return text.replace(/[&<>"']/g, function(m) { return map[m]; }); } 

这是HTML编码。 有没有原生的JavaScriptfunction来做到这一点,但你可以谷歌,并得到一些很好的做了。

例如http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/

编辑:
这是我testing过的:

 var div = document.createElement('div'); var text = document.createTextNode('<htmltag/>'); div.appendChild(text); console.log(div.innerHTML); 

输出: &lt;htmltag/&gt;

值得一读: http : //bigdingus.com/2007/12/29/html-escaping-in-javascript/

 escapeHTML: (function() { var MAP = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&#34;', "'": '&#39;' }; var repl = function(c) { return MAP[c]; }; return function(s) { return s.replace(/[&<>'"]/g, repl); }; })() 

注意 :只运行一次。 并且不要在已经编码的string上运行,例如&amp; 变成&amp;amp;

用jQuery可以这样:

 var escapedValue = $('<div/>').text(value).html(); 

从相关的问题用jQuery转义HTMLstring

正如在注释中提到的那样,双引号和单引号保留原来的实现。 这意味着如果您需要将元素属性设置为原始htmlstring,则不应使用此解决scheme。

Underscore.js为此提供了一个function:

 _.escape(string) 

转义string以插入到HTML中,replace&,<,>,和'字符。

http://underscorejs.org/#escape

这不是一个内置的Javascript函数,但是如果你已经在使用Underscore,那么如果你要转换的string不是太大,那么这是一个比编写你自己的函数更好的select。

还有一个要做的就是放弃所有的字符映射,而是将所有不需要的字符转换成它们各自的数字字符引用,例如:

 function escapeHtml(raw) { return raw.replace(/[&<>"']/g, function onReplace(match) { return '&#' + match.charCodeAt(0) + ';'; }); } 

请注意 ,指定的RegEx只处理OP想要转义的特定字符,但根据转义HTML的上下文,这些字符可能不够用。 Ryan Grove的文章除了&,<,>和HTML之外,还有更多关于HTML转义的内容, 这是对这个主题的一个很好的解读,根据你的上下文,为避免XSS注入,可能需要使用下面的RegEx:

 var regex = /[&<>"'` !@$%()=+{}[\]]/g 

这里有一个函数来转义HTML:

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

并解码:

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

我build议两个链接

这实现了完全的PHPfunction

http://phpjs.org/functions/htmlspecialchars:426

而且这个也是相反的

http://www.toao.net/32-my-htmlspecialchars-function-for-javascript

 String.prototype.escapeHTML = function() { return this.replace(/&/g, "&amp;") .replace(/</g, "&lt;") .replace(/>/g, "&gt;") .replace(/"/g, "&quot;") .replace(/'/g, "&#039;"); } 

样本:

 var toto = "test<br>"; alert(toto.escapeHTML()); 

对于Node.JS用户(或在浏览器中使用Jade运行时的用户),您可以使用Jade的转义函数。

 require('jade').runtime.escape(...); 

如果其他人维护它,没有任何意义。 🙂

 function htmlspecialchars(str) { if (typeof(str) == "string") { str = str.replace(/&/g, "&amp;"); /* must do &amp; first */ str = str.replace(/"/g, "&quot;"); str = str.replace(/'/g, "&#039;"); str = str.replace(/</g, "&lt;"); str = str.replace(/>/g, "&gt;"); } return str; } 

希望这赢得了比赛,因为它的performance,最重要的是不使用.replace('&','&')链接逻辑。replace('<','<')…

 var mapObj = { '&':"&amp;", '<':"&lt;", '>':"&gt;", '"':"&quot;", '\'':"&#039;" }; var re = new RegExp(Object.keys(mapObj).join("|"),"gi"); function escapeHtml(str) { return str.replace(re, function(matched) { return mapObj[matched.toLowerCase()]; }); } console.log('<script type="text/javascript">alert('Hello World');</script>'); console.log(escapeHtml('<script type="text/javascript">alert('Hello World');</script>')); 

倒过来一个:

 function decodeHtml(text) { return text .replace(/&amp;/g, '&') .replace(/&lt;/ , '<') .replace(/&gt;/, '>') .replace(/&quot;/g,'"') .replace(/&#039;/g,"'"); } 

JavaScript没有本地htmlspecialchars函数,但是您可以使用PHP作为服务 API直接调用PHP的htmlspecialchars函数。

例如,使用jQuery:

 var url = 'http://api.phpasaservice.com/htmlspecialchars?string=%3Cb%3Ehello+world%3C%2Fb%3E&callback=?'; $.getJSON(url, function(json) { var encodedString = json['return']; });