HtmlSpecialChars相当于Javascript?
显然,这比我想象的要难得多。 它甚至是如此简单…
有没有一个相当于PHP内置到Javascript中的htmlspecialchars的函数? 我知道你自己实现它是相当容易的,但是使用内置函数(如果可用)更好。
对于那些不熟悉PHP的人来说,htmlspecialchars将诸如<htmltag/>
类的东西翻译成<htmltag/>
我知道escape()
和encodeURI()
不以这种方式工作。
你的解决scheme代码有一个问题 – 它只会逃避每个特殊字符的第一个出现。 例如:
escapeHtml('Kip\'s <b>evil</b> "test" code\'s here'); Actual: Kip's <b>evil</b> "test" code's here Expected: Kip's <b>evil</b> "test" code's here
这里是正常工作的代码:
function escapeHtml(text) { return text .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'"); }
更新
下面的代码将产生与上述相同的结果,但它的性能更好,特别是在大块文本上(谢谢jbo5112 )。
function escapeHtml(text) { var map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; 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);
输出: <htmltag/>
值得一读: http : //bigdingus.com/2007/12/29/html-escaping-in-javascript/
escapeHTML: (function() { var MAP = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; var repl = function(c) { return MAP[c]; }; return function(s) { return s.replace(/[&<>'"]/g, repl); }; })()
注意 :只运行一次。 并且不要在已经编码的string上运行,例如&
变成&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 = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return str.replace(/[&<>"']/g, function(m) {return map[m];}); }
并解码:
function decodeHtml(str) { var map = { '&': '&', '<': '<', '>': '>', '"': '"', ''': "'" }; return str.replace(/&|<|>|"|'/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, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'"); }
样本:
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, "&"); /* must do & first */ str = str.replace(/"/g, """); str = str.replace(/'/g, "'"); str = str.replace(/</g, "<"); str = str.replace(/>/g, ">"); } return str; }
希望这赢得了比赛,因为它的performance,最重要的是不使用.replace('&','&')链接逻辑。replace('<','<')…
var mapObj = { '&':"&", '<':"<", '>':">", '"':""", '\'':"'" }; 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(/&/g, '&') .replace(/</ , '<') .replace(/>/, '>') .replace(/"/g,'"') .replace(/'/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']; });