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 相关文章推荐
Prototype1.5 rc2版指南最后一篇之Position
Jan 10 Javascript
JavaScript监测ActiveX控件是否已经安装过的代码
Sep 02 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
May 26 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
Dec 06 Javascript
jQuery.buildFragment使用方法及思路分析
Jan 07 Javascript
分享jQuery插件的学习笔记
Jan 14 Javascript
jQuery实现的导航动画效果(附demo源码)
Apr 01 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
Nov 25 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
May 15 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
Jul 26 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
Sep 18 Javascript
jQuery实现动态加载瀑布流
Sep 01 jQuery
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调用MySQL的存储过程的实现代码
2008/08/12 PHP
php flush类输出缓冲剖析
2008/10/19 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
PHP中串行化用法示例
2016/11/16 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
2018/12/15 Python
Python交互式图形编程的实现
2019/07/25 Python
Django框架表单操作实例分析
2019/11/04 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
几道PHP面试题
2013/04/14 面试题
社区党建工作方案
2014/06/10 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis