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 相关文章推荐
greybox——不开新窗口看新的网页
Feb 20 Javascript
基于jquery的地址栏射击游戏代码
Mar 10 Javascript
Node.js模块加载详解
Aug 16 Javascript
jQuery链使用指南
Jan 20 Javascript
Javascript中实现trim()函数的两种方法
Feb 04 Javascript
JavaScript实现斗地主游戏的思路
Feb 29 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
Sep 21 Javascript
js实现移动端微信页面禁止字体放大
Feb 16 Javascript
jQuery实现导航回弹效果
Feb 27 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
Aug 21 Javascript
面试题:react和vue的区别分析
Apr 08 Javascript
Vue两种组件类型:递归组件和动态组件的用法
Aug 06 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的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
php Session无效分析资料整理
2016/11/29 PHP
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
基于jquery实现五星好评
2017/11/18 jQuery
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
django框架自定义用户表操作示例
2018/08/07 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
python requests库的使用
2021/01/06 Python
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
一套SQL笔试题
2016/08/14 面试题
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
环保倡议书50字
2014/05/15 职场文书
国企干部对照检查材料
2014/08/22 职场文书
党员评议个人总结
2014/10/20 职场文书
2015年小学辅导员工作总结
2015/05/27 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python