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 相关文章推荐
jQuery bxCarousel实现图片滚动切换效果示例代码
May 15 Javascript
jQuery统计指定子元素数量的方法
Mar 17 Javascript
Angular在一个页面中使用两个ng-app的方法
Feb 20 Javascript
JavaScript拖动层Div代码
Mar 01 Javascript
vue2 自定义动态组件所遇到的问题
Jun 08 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
Aug 18 Javascript
jQuery中过滤器的基本用法示例
Oct 11 jQuery
vue2.5.2使用http请求获取静态json数据的实例代码
Feb 27 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
May 28 jQuery
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
Aug 24 Javascript
vue store之状态管理模式的详细介绍
Jun 13 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
Jun 18 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 Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
解析php中curl_multi的应用
2013/07/17 PHP
php中get_object_vars()方法用法实例
2015/02/08 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
JS实现字体背景跑马灯
2020/01/06 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
python打开文件并获取文件相关属性的方法
2015/04/23 Python
一些Python中的二维数组的操作方法
2015/05/02 Python
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
如何定义一个可复用的服务
2014/09/30 面试题
出国签证在职证明
2014/01/16 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
个人诉讼委托书范本
2014/10/17 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
环保建议书作文500字
2015/09/14 职场文书
实现GO语言对数组切片去重
2022/04/20 Golang