将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类和继承 constructor属性
Mar 04 Javascript
javascript贪吃蛇完整版(源码)
Dec 09 Javascript
谈谈JavaScript中function多重理解
Aug 28 Javascript
快速掌握Node.js事件驱动模型
Mar 21 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
Jan 21 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
Jul 26 Javascript
vue src动态加载请求获取图片的方法
Oct 17 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
Nov 29 Javascript
微信小程序实现搜索历史功能
Mar 26 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
Dec 24 Javascript
详解JavaScript中new操作符的解析和实现
Sep 04 Javascript
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
Apr 03 Javascript
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
php curl选项列表(超详细)
2013/07/01 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
ajax异步请求详解
2017/01/06 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
three.js 入门案例详解
2018/01/23 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
python中查找excel某一列的重复数据 剔除之后打印
2013/02/10 Python
详解Python中的各种函数的使用
2015/05/24 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
Python之时间和日期使用小结
2019/02/14 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
日语专业个人的求职信
2013/12/03 职场文书
开发房地产协议书
2014/09/14 职场文书
婚礼答谢礼品
2015/01/20 职场文书
法律意见书范文
2015/05/20 职场文书
庆元旦主持词
2015/07/06 职场文书
mybatis 获取更新记录的id
2022/05/20 Java/Android