转自:http://blog.csdn.net/hj7jay/article/details/51280405 

众所周知页面上的字符内容通常都需要进行HTML转义才能正确显示,尤其对于Input,Textarea提交的内容,更是要进行转义以防止javascript注入攻击。

  通常的HTML转义主要是针对内容中的"<",">","&",以及空格、单双引号等。但其实还有很多字符也需要进行转义。具体的可以参考这篇文章
** 1、HTML转义
  参考上面的提到的文章,基本上可以确定以下的转义的范围和方式。
  1)对"\""、"&"、"'"、"<"、">"、空格(0x20)、0x00到0x20、0x7F-0xFF
  以及0x0100-0x2700的字符进行转义,基本上就覆盖的比较全面了。
  
   用javascript的正则表达式可以写为:
   this.REGX_HTML_ENCODE = /"|&|'|<|>|[\x00-\x20]|[\x7F-\xFF]|[\u0100-\u2700]/g; 
  2)为保证转义结果对浏览器的无差别,转义编码为实体编号,而不用实体名称。
  
  3)空格(0x20)通常转义为“ ”也就是“ ”。
  转义的代码非常简单:
  
[javascript] view plain copy

  1. this.encodeHtml = function(s){
  2. return (typeof s != "string") ? s :
  3. s.replace(this.REGX_HTML_ENCODE,
  4. function($0){
  5. var c = $0.charCodeAt(0), r = ["&#"];
  6. c = (c == 0x20) ? 0xA0 : c;
  7. r.push(c); r.push(";");
  8. return r.join("");
  9. });
  10. };
** 2、反转义
  既然有转义,自然需要反转义。
  1) 对“&#num;”实体编号的转义,直接提取编号然后fromCharCode就可以得到字符。
  2) 对于诸如“<”,需要建立一张如下的表来查询。
   this.HTML_DECODE = {
        "<"  : "<", 
        ">"  : ">", 
        "&" : "&", 
        " ": " ", 
        """: "\"", 
        "©": "©"
        // Add more
   };
  由此我们可以有反转义的正则表达式:
  this.REGX_HTML_DECODE = /&\w+;|&#(\d+);/g;
  反转的代码也很简单,如下:
[javascript] view plain copy

  1. this.decodeHtml = function(s){
  2. return (typeof s != "string") ? s :
  3. s.replace(this.REGX_HTML_DECODE,
  4. function($0,$1){
  5. var c = this.HTML_ENCODE[$0]; // 尝试查表
  6. if(c === undefined){
  7. // Maybe is Entity Number
  8. if(!isNaN($1)){
  9. c = String.fromCharCode(($1 == 160) ? 32 : $1);
  10. }else{
  11. // Not Entity Number
  12. c = $0;
  13. }
  14. }
  15. return c;
  16. });
  17. };

** 3、一个有意思的认识
  其实在用正则表达式转义之前,我一直都是用遍历整个字符串,逐个比较字符的方式。直到有一天,看到一篇文章说,javascript正则表达式是C实现的,比自己用javascript遍历字符要快,于是我就试着改写成上面这种方式。虽然代码看起来的确显得神秘而又牛叉,但遗憾的是,在我的Chrome 11 (FreeBSD 64 9.0)上,遍历字符转义/反转的方式要比上面正则表达式的代码快2到3倍(字符串长度越长越明显)。其实,想想也能明白为什么。
** 4、完整版本的代码
[javascript] view plain copy

  1. $package("js.lang"); // 没有包管理时,也可简单写成 js = {lang:{}};
  2. js.lang.String = function(){
  3. this.REGX_HTML_ENCODE = /"|&|'|<|>|[\x00-\x20]|[\x7F-\xFF]|[\u0100-\u2700]/g;
  4. this.REGX_HTML_DECODE = /&\w+;|&#(\d+);/g;
  5. this.REGX_TRIM = /(^\s*)|(\s*$)/g;
  6. this.HTML_DECODE = {
  7. "<" : "<",
  8. ">" : ">",
  9. "&" : "&",
  10. " ": " ",
  11. """: "\"",
  12. "©": ""
  13. // Add more
  14. };
  15. this.encodeHtml = function(s){
  16. s = (s != undefined) ? s : this.toString();
  17. return (typeof s != "string") ? s :
  18. s.replace(this.REGX_HTML_ENCODE,
  19. function($0){
  20. var c = $0.charCodeAt(0), r = ["&#"];
  21. c = (c == 0x20) ? 0xA0 : c;
  22. r.push(c); r.push(";");
  23. return r.join("");
  24. });
  25. };
  26. this.decodeHtml = function(s){
  27. var HTML_DECODE = this.HTML_DECODE;
  28. s = (s != undefined) ? s : this.toString();
  29. return (typeof s != "string") ? s :
  30. s.replace(this.REGX_HTML_DECODE,
  31. function($0, $1){
  32. var c = HTML_DECODE[$0];
  33. if(c == undefined){
  34. // Maybe is Entity Number
  35. if(!isNaN($1)){
  36. c = String.fromCharCode(($1 == 160) ? 32:$1);
  37. }else{
  38. c = $0;
  39. }
  40. }
  41. return c;
  42. });
  43. };
  44. this.trim = function(s){
  45. s = (s != undefined) ? s : this.toString();
  46. return (typeof s != "string") ? s :
  47. s.replace(this.REGX_TRIM, "");
  48. };
  49. this.hashCode = function(){
  50. var hash = this.__hash__, _char;
  51. if(hash == undefined || hash == 0){
  52. hash = 0;
  53. for (var i = 0, len=this.length; i < len; i++) {
  54. _char = this.charCodeAt(i);
  55. hash = 31*hash + _char;
  56. hash = hash & hash; // Convert to 32bit integer
  57. }
  58. hash = hash & 0x7fffffff;
  59. }
  60. this.__hash__ = hash;
  61. return this.__hash__;
  62. };
  63. };
  64. js.lang.String.call(js.lang.String);

   在实际的使用中可以有两种方式:
  1)使用js.lang.String.encodeHtml(s)和js.lang.String.decodeHtml(s)。
  2)还可以直接扩展String的prototype
  
[javascript] view plain copy

  1. js.lang.String.call(String.prototype);
  2. // 那么
  3. var str = "&'\"中国abc def";
  4. var ec_str = str.encodeHtml();
  5. document.write(ec_str);
  6. document.write(""); // CU的博客在线编辑有bug,
  7. 放不上来!!!
  8. var dc_str = ec_str.decodeHtml();
  9. document.write(dc_str);

用Javascript(js)进行HTML转义工具(处理特殊字符显示)的更多相关文章

  1. Bootstrap入门(二十八)JS插件5:工具提醒

    Bootstrap入门(二十八)JS插件5:工具提醒 工具提示在使用过程中比较常见,但是实现起来有些麻烦,而bootstrap则很好地解决了这个问题. 我们来写一个简单的实例 先引入CSS文件和JS文 ...

  2. JS转换HTML转义符,编码及解码

    JS转换HTML转义符 //去掉html标签 function removeHtmlTab(tab) { return tab.replace(/<[^<>]+?>/g,'') ...

  3. 几种常见的JavaScript混淆和反混淆工具分析实战

    几种常见的JavaScript混淆和反混淆工具分析实战 xiaix2016-03-05+8共1195751人围观 ,发现 5 个不明物体WEB安全 信息安全常被描述成一场军备竞赛,白帽与黑帽,渗透测试 ...

  4. 2017最好的JavaScript框架、库和工具 — SitePoint

    与开发者数量相比,可能有更多的JavaScript框架.库和工具.截止到2017年5月,在GitHub上快速搜索能搜到超过110万的JavaScript项目. 在npmjs上有50万的可用包,并且这些 ...

  5. 前端Js框架汇总(工具多看)

    前端Js框架汇总(工具多看) 一.总结 一句话总结: 二.前端Js框架汇总 概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领 ...

  6. 【JS】JS实现Html转义和反转义(html编码和解码)的方法总结

    1.JS实现html转义和反转义主要有两种方式: 1).利用用浏览器内部转换器实现html转义: 2).用正则表达式实现html转义: 2.封装的JS工具类: var HtmlUtil = { /*1 ...

  7. js正则表达式图形化工具-rline

    github地址:https://github.com/finance-sh/rline 在线demo: http://lihuazhai.com/demo/test.html 这是一个js正则表达式 ...

  8. JS转换HTML转义符

    JS转换HTML转义符 //去掉html标签 function removeHtmlTab(tab) { return tab.replace(/<[^<>]+?>/g,'') ...

  9. javascript(js)小数精度丢失的解决方案

    原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况. javascript(js)的小数点加减乘除问题,是一个js的bug如0.3* ...

  10. 【转】关于URL编码/javascript/js url 编码/url的三个js编码函数

    来源:http://www.cnblogs.com/huzi007/p/4174519.html 关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),e ...

随机推荐

  1. vuejs的动态过滤

    想要通过vuejs动态过滤(这里动态指得是过滤的条件是动态变化的), 一直没找到好办法, 最蠢的办法当然是两个两个数组,一个作为原始副本数组 一个作为视图数组,这样当过滤条件变化的时候 动态拷贝原始数 ...

  2. on事件委托

    on绑定多个事件,off解绑事件,one事件只执行一次 on除了能够处理未来事件,还可以对事件进行委托处理 $('div').on('click', 'p', function(event)(也就是通 ...

  3. linux tcl expect 安装(转)

    linux tcl expect 安装 一.Tcl安装 1.  下载:tcl8.4.20-src.tar.gz http://www.tcl.tk/software/tcltk/downloadnow ...

  4. jenkins 入门教程(上)

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...

  5. Apache Shiro系列四,概述 —— Shiro的架构

    Shiro的设计目标就是让应用程序的安全管理更简单.更直观.     软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如 ...

  6. JS组件系列——Bootstrap Table 表格行拖拽

    前言:之前一直在研究DDD相关知识,好久没更新JS系列文章了.这两天做了一个简单的业务需求,觉得效果还可以,今天在这里分享给大家,欢迎拍砖~~ 一.业务需求及实现效果 项目涉及到订单模块,那天突然接到 ...

  7. Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发

    Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧, ...

  8. sublimetext3安装px转rem的神器

    在用sublimetext3写css的时候,我们有时会进行单位换算,为了更快的获得我们想要的单位结果,我们可以安装cssrem这个神器(插件). 首先,我们要先下载好插件,下载地址如下: 地址:htt ...

  9. 集合覆盖 顶点覆盖: set cover和vertex cover

    这里将讲解一下npc问题中set cover和vertex cover分别是什么. set cover: 问题定义: 实例:现在有一个集合A,其中包含了m个元素(注意,集合是无序的,并且包含的元素也是 ...

  10. CSS编写技巧

    1.尽量少的使用全局的重置代码 全局重置代码:*{margin:0; padding:0;}对于熟悉CSS的人来说并不陌生,并且有很多人的第一句CSS代码就是这句.它可以避免不同浏览器的默认间距不同而 ...