将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 相关文章推荐
js prototype 格式化数字 By shawl.qiu
Apr 02 Javascript
javascript采用数组实现tab菜单切换效果
Dec 12 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
Dec 03 Javascript
jQuery实现搜索页面关键字的功能
Feb 16 Javascript
Angular表格神器ui-grid应用详解
Sep 29 Javascript
mui back 返回刷新页面的实例
Dec 06 Javascript
setTimeout与setInterval的区别浅析
Mar 23 Javascript
js核心基础之构造函数constructor用法实例分析
May 11 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 Javascript
小程序新版订阅消息模板消息
Dec 31 Javascript
在vue中通过render函数给子组件设置ref操作
Nov 17 Vue.js
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中的Base62类(适用于数值转字符串)
2013/08/12 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
详解Django框架中的视图级缓存
2015/07/23 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
厨师岗位职责
2013/11/12 职场文书
关于人生的感言
2014/01/17 职场文书
餐厅筹备计划书
2014/04/25 职场文书
会计学专业自荐信
2014/06/25 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
公司管理制度范本
2015/08/03 职场文书
公司管理建议书
2015/09/14 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS