将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 相关文章推荐
JQuery的ajax基础上的超强GridView展示
Sep 18 Javascript
js截取字符串的两种方法及区别详解
Nov 05 Javascript
javascript类型转换示例
Apr 29 Javascript
JS回调函数的应用简单实例
Sep 17 Javascript
JS实现图片产生波纹一样flash效果的方法
Feb 27 Javascript
javascript原生ajax写法分享
Apr 10 Javascript
jQuery实现frame之间互通的方法
Jun 26 jQuery
Vue实例中生命周期created和mounted的区别详解
Aug 25 Javascript
完美解决axios跨域请求出错的问题
Feb 05 Javascript
JavaScript实现图片轮播特效
Oct 23 Javascript
Vue通过WebSocket建立长连接的实现代码
Nov 05 Javascript
微信小程序加载机制及运行机制图解
Nov 27 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+SqlServer实现分页显示
2006/10/09 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
Java 生成随机字符的示例代码
2021/01/13 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
浅谈Python 的枚举 Enum
2017/06/12 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
人事助理自荐信
2014/02/02 职场文书
班级德育工作实施方案
2014/02/21 职场文书
新闻报道策划方案
2014/06/11 职场文书
项目合作意向书模板
2014/07/29 职场文书
公民授权委托书范本
2014/09/17 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
java实现web实时消息推送的七种方案
2022/07/23 Java/Android