将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(JS) 压缩 / 混淆 / 格式化 批处理工具
Dec 10 Javascript
基于jquery的多功能软键盘插件
Jul 25 Javascript
javascript学习(二)javascript常见问题总结
Jan 02 Javascript
jquery控制左右箭头滚动图片列表的实例
May 20 Javascript
jquery网页元素拖拽插件效果及实现
Aug 05 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
Sep 01 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
Oct 06 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
Angular通过angular-cli来搭建web前端项目的方法
Jul 27 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
May 31 jQuery
vuex vue简单使用知识点总结
Aug 29 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
Oct 16 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
Python引用传值概念与用法实例小结
2017/10/07 Python
python实现二维数组的对角线遍历
2019/03/02 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Python:slice与indices的用法
2019/11/25 Python
python实现堆排序的实例讲解
2020/02/21 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
MIS软件工程师的面试题
2016/04/22 面试题
公司清洁工岗位职责
2013/12/14 职场文书
指导教师评语
2014/04/26 职场文书
电力安全事故反思
2014/04/27 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
工地宣传标语
2014/06/18 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
学校党支部承诺书
2015/04/30 职场文书
如何正确理解python装饰器
2021/06/15 Python
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL