Prototype源码浅析 String部分(三)之HTML字符串处理


Posted in Javascript onJanuary 15, 2012
HTML处理 stripTags  | escapeHTML |  unescapeHTML
   
JSON处理 unfilterJSON |  isJSON |  evalJSON |  parseJSON
脚本处理 stripScripts |  extractScripts  | evalScripts
现在,String部分转入具体的关联应用,分别对应
HTML字符串,JSON字符串和HTML中的脚本字符串。
【乱入一句,有关JSON的一点东西,可以看看http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html】
下面分别叙述:
一、HTML字符串
stripTags :移除字符串中所有的 HTML 标签。
escapeHTML : 将 HTML 特殊字符转换为它们的等价实体。(&对应& <对应< >对应> )
unescapeHTML :移除字符串中的标签,并将用实体表示的 HTML 特殊字符转换为它们的正常形式。(escapeHTML 的逆操作)
stripTags 中的一段正则/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi用来匹配标签中的内容,注意不能换行,不过换行的话就有语法错误了。
【这个方法唯一需要注意的位置是,stripTags会移除<script>标签,但是不会移除里面的内容,所以可能将<script>里面的内容暴露出来,影响页面结构】
二、脚本字符串
stripScripts : 移除字符串中所有的 HTML script 块。弥补stripTags方法对script标签的缺陷
extractScripts :提取出字符串中包含的所有 script 的内容,并将之返回作为一个字符串数组。
evalScripts :执行字符串中包含的所有 script 块的内容。返回一个数组,该数组包含每个 script 执行后返回的值。
stripScripts中的正则是对stripTags中一个正则的发展
function stripScripts() { 
var pattern = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img');//i忽略大小写,m换行,g全局 
return this.replace(pattern , ''); 
}

function extractScripts() { 
var matchAll = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img'), 
matchOne = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'im'); 
return (this.match(matchAll) || []).map(function(scriptTag) { 
return (scriptTag.match(matchOne) || ['', ''])[1]; 
}); 
}

map是对数组的一个扩展,某些浏览器有这个原生方法,参见《chrome原生方法之数组》
最后获得的是一个所有script标签内部内容的一个数组,因此evalScripts 的做法就很自然的可以想出来——循环遍历获得的数组,然后依次执行(eval),存储每一项执行的结果。
function evalScripts() { 
return this.extractScripts().map(function(script) { return eval(script) }); 
}

三、JSON处理
unfilterJSON:移除 Ajax JSON 或 JavaScript 响应内容周围的安全注释界定符。
isJSON:使用正则表达式检测字符串是否是合法的 JSON 格式
evalJSON:执行一个 JSON 格式的字符串,并返回结果对象
其中isJSON和evalJSON就是JSON.js中的parseJSON,而且代码也差不多,参见《从字符串中解析出JSON》
顺便说一点unfilterJSON中的安全注释界定符,这是一种安全机制,对于自家的数据,可以在返回值两端加上特殊的字符(界定符)来表明数据的来源,客户端解析的时候用unfilterJSON来处理掉添加的界定符,借此可以在一定程度上减少一些XSS的攻击。
Prototype中默认的形式是:
'/*-secure-\n{"name": "小西山子","age": 24}\n*/'
其中界定符号是 /*-secure-\n'和'\n*/'
Javascript 相关文章推荐
网页自动刷新,不产生嗒嗒声的一个解决方法
Mar 27 Javascript
广告切换效果(缓动切换)
May 27 Javascript
js或css实现滚动广告的几种方案
Jan 28 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
Jan 11 Javascript
解决checkbox的attr(checked)一直为undefined问题
Jun 16 Javascript
Bootstrap每天必学之简单入门
Nov 19 Javascript
jQuery遍历DOM元素与节点方法详解
Apr 14 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
Mar 08 Javascript
Vue.js教程之axios与网络传输的学习实践
Apr 29 Javascript
javascript将url解析为json格式的两种方法
Aug 18 Javascript
使用js获取伪元素的content实例
Oct 24 Javascript
node.js如何操作MySQL数据库
Oct 29 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
Jan 15 #Javascript
用js小类库获取浏览器的高度和宽度信息
Jan 15 #Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
Jan 15 #Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
Jan 13 #Javascript
20个最新的jQuery插件
Jan 13 #Javascript
JSON 数据格式介绍
Jan 13 #Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
Jan 13 #Javascript
You might like
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
PHP实现添加购物车功能
2017/03/06 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
pygame实现成语填空游戏
2019/10/29 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
护理自荐信范文
2013/10/05 职场文书
护理自我鉴定范文
2013/10/06 职场文书
美容院店长岗位职责
2014/04/08 职场文书
服务承诺书范文
2014/05/19 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
超市采购员岗位职责
2015/04/07 职场文书
学生通报表扬范文
2015/05/04 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python