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 相关文章推荐
Javascript实现的分页函数
Feb 07 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 Javascript
jquery一句话全选/取消全选
Mar 01 Javascript
利用jQuery接受和处理xml数据的代码(.net)
Mar 28 Javascript
基于Jquery实现表格动态分页实现代码
Jun 21 Javascript
node.js中的fs.fchown方法使用说明
Dec 16 Javascript
修改ligerui 默认确认按钮的方法
Dec 27 Javascript
EL表达式截取字符串的函数说明
Sep 22 Javascript
详解使用VueJS开发项目中的兼容问题
Aug 02 Javascript
layui 富文本赋值,取值,取纯文本值的实例
Sep 18 Javascript
js函数和this用法实例分析
Mar 13 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
Sep 24 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
对Session和Cookie的区分与解释
2007/03/16 PHP
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
python新手学习使用库
2020/06/11 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
Python如何读取、写入JSON数据
2020/07/28 Python
迟到检讨书5000字
2014/01/31 职场文书
财产公证书样本
2014/04/04 职场文书
语文教育专业求职信
2014/06/28 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android