将HTML的左右尖括号等转义成实体形式的两种实现方式


Posted in Javascript onMay 04, 2014

前端开发工作中,经常需要将HTML的左右尖括号等转义成实体形式。我们不能把<,>,&等直接显示在最终看到的网页里。需要将其转义后才能在网页上显示。

转义字符(Escape Sequence)也称字符实体(Character Entity)。定义转义字符串的主要原因是

“<”和“>”等符号已经用来表示HTML TAG,因此不能直接当作文本中的符号来使用。但有时需求是在HTML页面上使用这些符号,所以需要定义它的转义字符串。
有些字符在ASCII字符集中没有定义(如版权符号“©”)。因此需要使用转义字符(“©”对应的转义字符是“©”)来表示。

这里提供两个函数escape和unescape,分别实现将HTML转义为实体和回转。

方式一、一个映射表+正则替换

var keys = Object.keys || function(obj) { 
obj = Object(obj) 
var arr = [] 
for (var a in obj) arr.push(a) 
return arr 
} 
var invert = function(obj) { 
obj = Object(obj) 
var result = {} 
for (var a in obj) result[obj[a]] = a 
return result 
} 
var entityMap = { 
escape: { 
'&': '&', 
'<': '<', 
'>': '>', 
'"': '"', 
"'": ''' 
} 
} 
entityMap.unescape = invert(entityMap.escape) 
var entityReg = { 
escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'), 
unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g') 
} // 将HTML转义为实体 
function escape(html) { 
if (typeof html !== 'string') return '' 
return html.replace(entityReg.escape, function(match) { 
return entityMap.escape[match] 
}) 
} 
// 将实体转回为HTML 
function unescape(str) { 
if (typeof str !== 'string') return '' 
return str.replace(entityReg.unescape, function(match) { 
return entityMap.unescape[match] 
}) 
}

方式二、利用浏览器DOM API
// 将HTML转义为实体 
function escape(html){ 
var elem = document.createElement('div') 
var txt = document.createTextNode(html) 
elem.appendChild(txt) 
return elem.innerHTML; 
} 
// 将实体转回为HTML 
function unescape(str) { 
var elem = document.createElement('div') 
elem.innerHTML = str 
return elem.innerText || elem.textContent 
}

有个缺陷是只能转义“< > & ”,对于单引号,双引号都不转义。另外一些非ASCII也不能转义。选择时须注意。

比较:

方式1 代码量较大,但灵活性,完整性都比方式2强。可根据需求添加或减少映射表entityMap,且可以运行在任意JS环境中。

方式2 为hack方式,代码量少很多,利用浏览器内部API就行了转义和转回(主流浏览器都支持)。不具完整性,很明显只能在浏览器环境中使用(比如不能在Node.js中跑)。

Javascript 相关文章推荐
javascript,jquery闭包概念分析
Jun 19 Javascript
javascript中节点的最近的相关节点访问方法
Mar 20 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
Mar 05 Javascript
JS表格组件神器bootstrap table详解(强化版)
May 26 Javascript
jQuery插件zTree实现删除树子节点的方法示例
Mar 08 Javascript
Webpack如何引入bootstrap的方法
Jun 17 Javascript
详解Node全局变量global模块
Sep 28 Javascript
vue组件的写法汇总
Apr 12 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
Feb 27 Javascript
Node.js之readline模块的使用详解
Mar 25 Javascript
javascript中this的用法实践分析
Jul 29 Javascript
jquery实现直播视频弹幕效果
Feb 25 jQuery
IE6-8中Date不支持toISOString的修复方法
May 04 #Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 #Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 #Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
May 04 #Javascript
使用JavaScript获取电池状态的方法
May 03 #Javascript
JavaScript打印网页指定区域的例子
May 03 #Javascript
js检测输入内容全为空格的方法
May 03 #Javascript
You might like
phpBB BBcode处理的漏洞
2006/10/09 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
accesskey 提交
2006/06/26 Javascript
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
jquery判断元素的子元素是否存在的示例代码
2014/02/04 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
vue中slot(插槽)的介绍与使用
2018/11/12 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
基于javascript的拖拽类封装详解
2019/04/19 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
Python中关于字符串对象的一些基础知识
2015/04/08 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
python__name__原理及用法详解
2019/11/02 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
pycharm导入源码的具体步骤
2020/08/04 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
C++面试题目
2013/06/25 面试题
信用卡结清证明怎么写
2014/09/13 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
单位工作证明书格式
2014/10/04 职场文书
介绍信如何写
2015/01/31 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python