- 浏览: 508789 次
- 性别:
- 来自: 初到北京
最新评论
-
javamonkey:
有点老了,有个Teb测试,这个性能测试很标准http://gi ...
几款模板引擎的性能对比 -
greenlaw110:
xuyao 写道sdh5724 写道xuyao 写道很好,nn ...
几款模板引擎的性能对比 -
sefier:
不知道你看的是哪个版本的,现在所看到的版本和你所描述的不一致, ...
Facebook XHP 调研 -
javatar:
我觉得从通用语言去思考可能更有意思,满足八封其实就是一个完备集 ...
五行通天地 八卦定乾坤--打算按照先天八卦的形制重构Lite模版引擎的指令集 -
luo2pei4321:
MVEL的官方例子里面好像只支持Integer和String两 ...
表达式引擎JSEL介绍
为了支持JSI包定义中的模式匹配(方便某些懒人)。我需要一个查找脚本全局变量的脚本。
一直没有勇气编写JS的完整语法解析程序,所以,只能走一些旁门左道。
在自己机器上测试了 213个脚本文件。与Rhino的解析结果对比。测试通过。
应该比较可靠了。
这个脚本好早就写过了,一直没有满意的结果,现在算比较满意了。
一直没有勇气编写JS的完整语法解析程序,所以,只能走一些旁门左道。
/* * JavaScript Integration Framework * License LGPL(您可以在任何地方免费使用,但请不要吝啬您对框架本身的改进) * http://www.xidea.org/project/jsi/ * @author jindw * @version $Id: fn.js,v 1.5 2008/02/24 08:58:15 jindw Exp $ */ /** * * @param <String> source 脚本源文件 * @return <Array> 改脚本中的定层申明变量(包括函数) */ function findGlobals(source){ source = replaceSpecialEntry(source.replace(/^\s*#.*/,'')); //简单的实现,还以为考虑的问题很多很多: var varFlagMap = {}; var scopePattern = /\b(function\b[^\(]*)[^{]+\{|\{|\}|\[|\]/mg;//|{\s*(?:[\$\w\d]+\s*\:\s*(?:for|while|do)\b|""\:) //找到办法不用判断了,省心了。。。。 //var objectPattern = /\{\s*(?:[\$\w\d]+|"")\:/mg var varPattern = /\b(var|function|,)\b\s*([\w\$]+)\s*/mg; //var lineParrern = /([\$\w]+|[^\$\w])\s*[\r\n]+\s*([\$\w]+|[^\$\w])/g var buf = []; var fnDepth = 0; var arrayDepth = 0; var begin = 0; var match; while(match = scopePattern.exec(source)){ switch(match[0] ){ //array case '[': if(!fnDepth){ if(!arrayDepth){ buf.push(source.substring(begin,match.index),'[]'); } arrayDepth ++; } break; case ']': if(!fnDepth){ arrayDepth --; if(!arrayDepth){ begin = match.index+1; } } break; //function case '{': if(!arrayDepth && fnDepth){//in function fnDepth++; } break; case '}': if(!arrayDepth && fnDepth){//in function fnDepth--; if(fnDepth == 0){ begin = match.index+1; } } break; default://function.. if(!arrayDepth){ if(!fnDepth){ buf.push(source.substring(begin,match.index),match[1],'}'); } fnDepth++; } break; } } buf.push(source.substr(begin)) source=buf.join(''); source = source.replace(/([\w\$\]])\s*\([\w\$\d,]*\)/m,'$1()'); begin = 0; while(match = varPattern.exec(source)){ switch(match[1]){ case 'var': begin = match.index; case 'function': varFlagMap[match[2]] = 1; default://, var next = source.charAt(match.index + match[0].length); if(next!=':'){ var temp = source.indexOf(';',begin); if(temp>0 && temp<match.index){ continue; } try{ //不知道是不是还有什么问题 temp = source.substring(begin,match.index); //if(/var|if|else/.test(temp)){continue;} temp = temp.replace(/[\r\n]/g,' '); new Function(temp+',a;') }catch(e){ continue; } varFlagMap[match[2]] = 1; } } } var result = []; for(match in varFlagMap){ result.push(match) } return result; } /** * java 接口 * @param <String>source 脚本源码 * @return java.util.Collection 返回全局id集合 */ function findGlobalsAsList(source){ var result = findGlobals(source) var list = new java.util.ArrayList(); for (var i = 0; i < result.length; i++) { list.add(result[i]); } return list; } var specialRegExp = new RegExp([ //muti-comment '/\\*(?:[^\\*]|\\*[^/])*\\*/', //single-comment '//.*$', //string '"(?:\\\\(?:.|\\r|\\n|\\r\\n)|[^"\\n\\r])*"', "'(?:\\\\(?:.|\\r|\\n|\\r\\n)|[^'\\n\\r])*'", '/.*/' ].join('|'),'m'); function replaceSpecialEntry(source){ var head = ''; var tail = source; var p1 outer: while(p1 = specialRegExp.exec(tail)){ var p2 = p1.index + p1[0].length; var p1 = p1.index; if(tail.charAt(p1) == '/'){ switch(tail.charAt(p1 + 1)){ case '/': case '*': head += tail.substr(0,p1); tail = tail.substr(p2+1); continue outer; } try{//试探正则 new Function(head+tail.replace(specialRegExp,"/\\$&")); //是正则 p2 = p1; while((p2 = tail.indexOf('/',p2)+1)>p1){ //println([p1,p2]);//,tail.substring(p1,p2) try{ var text = tail.substring(p1,p2); if(/.*/.test(text)){//有效正则 new Function(text); } head += tail.substr(0,p1)+"/./"; tail = tail.substr(p2); continue outer; }catch(e){ //无效,继续探测 } } throw new Error("怎么可能??^_^"); }catch(e){ //只是一个除号:( head += tail.substr(0,p1+1); tail = tail.substr(p1+1); continue outer; } }else{ head += tail.substr(0,p1)+'""'; tail = tail.substr(p2+1); continue outer; } } return head + tail; }
在自己机器上测试了 213个脚本文件。与Rhino的解析结果对比。测试通过。
应该比较可靠了。
这个脚本好早就写过了,一直没有满意的结果,现在算比较满意了。
发表评论
-
JSA 发布一个新的预览版本
2009-07-27 01:15 1484主要功能是: 1。带上了原来的经典UI界面。 增加了一 ... -
CGI还是个不错的玩意
2009-06-20 18:52 1000JSI的调试辅助程序目前提供有JavaServlet版本和ph ... -
用两句话来解释JSI是怎么隔离JavaScript变量冲突的
2009-06-01 17:08 1305“我还是一直没有明白jsi是怎么隔离名字空间的” 好,大家的 ... -
端午在家搞了一个基于JSI的脚本发布系统
2009-05-31 13:06 1356项目上线之前,脚本都要手动重新组合压缩。挺麻烦的,JSICDN ... -
把JSA部署在GoogleAppEngine上,迎接我的是一张笑脸^_^
2009-05-03 02:47 1031第一个无意的测试,结果打印出了一张笑脸^_^ 只是随便输的.真 ... -
关于JSI装饰引擎改进的一些想法
2009-02-16 18:29 908今天看到bellstar大侠发布的SUI,也看了一些设计及实现 ... -
水月镜花
2009-02-07 21:11 1007刚才cctv4在播放着《激情燃烧的岁月》。一些情节开始看着很有 ... -
韬光养晦 厚积薄发
2008-10-22 21:34 2100最近被反复问道,JSI还在继续吗? 开始感觉很诧异,后来想想也 ... -
JSI 类库文件格式探讨
2008-08-05 20:08 2618在JSI中打包脚本类库。 目前只有jar方式,同时支持java ... -
使用中间数据格式优化前端模板性能的想法
2008-06-12 21:24 1818前端时间这里出现了不少讨论前端模板的帖子。 我还是原来的观点 ... -
JSA压缩Prototype1.6时,经常表现的一个错误
2008-05-07 21:15 2453开始发帖错误,我的测试不够严谨。 经过测试,IE也没有踩 ... -
发布一个JSI Example Project
2008-04-30 14:58 4039部署到Tomcat中,打开script目录,可以显示你当前sc ... -
JSI Side 代码风格与规范
2008-04-29 22:07 6114准备编写JSI的外围元素 ... -
给大家展示一下JSI文档工具和导出工具
2008-02-21 11:43 3661演示地址(目前只支持Firefox): http://www. ... -
JSI的延迟装载和异步装载过程的一些原理解释
2008-02-14 17:13 6422出自该贴的回复: http://www.iteye.com/t ... -
JSIDoc设计的两个失败点
2008-02-08 00:11 3673JSIDoc是我一年前开发的用来解析JS文档的纯客户端脚本程序 ... -
JSI的导入指令参数顺序调整意见征询
2008-02-07 17:20 7908改动 2.0方式: $import(path,callbac ... -
JSI2.1计划
2008-01-01 21:13 7122先回顾历史: JSI1(2006-2007)是个简单的框架,只 ... -
JSA 压缩JS时的常见问题
2007-12-30 16:08 42031。保留字滥用 如果你的脚本中存在某些保留字或者关键字属性甚至 ... -
脚本合并时混淆隔离的三个级别
2007-12-23 13:38 3531直接合并--传统方式 根据脚本依赖关系,组织好导入顺序,简单的 ...
相关推荐
这样做可以防止通过POST或GET提交的变量未经验证直接作为全局变量使用,从而避免潜在的安全风险。之后,需要使用预定义的超全局数组,如`$_GET`和`$_POST`,来正确获取用户输入。 总的来说,对PHP进行安全配置涉及...
通常,这样的探针会包含一系列的PHP函数调用,例如`phpinfo()`来显示所有PHP配置,`$_SERVER`全局变量来获取服务器信息,以及可能的数据库连接尝试等。 总的来说,PHP探针是服务器管理和开发中的一个实用工具,它使...
3. **利用Nmap库**:Nmap NSE提供了丰富的库,如nsock(用于网络I/O)、nmap.io(用于低级别I/O)、nmap.registry(用于全局变量)等,可以帮助你编写网络扫描脚本。 4. **编写脚本逻辑**:根据你的需求,设计脚本的...
在`public Function`之外定义变量为全局变量,也可以将值写入Excel,执行时导入到`Global`对象中。 5. **通过程序点击页面对象**: 编写脚本时,仅需知道页面标题和控件的name即可。例如,点击“百度一下,你就...
6. **环境变量**:全局变量,影响整个Shell会话。 7. **别名**:为常用命令创建简写,方便快速输入。 8. **脚本权限**:设置执行权限(如`chmod +x script.sh`),使脚本可执行。 在安全测试领域,这些脚本可能包含...
- **bird-common.conf**:这是一个全局配置文件,包含了所有VRF共享的配置项,如全局路由策略、日志记录等。 - **bird-vrf1.conf**:每个VRF都需要一个单独的配置文件。这个例子中的`bird-vrf1.conf`定义了特定于...
在`main`函数中,我们可以看到`paths`、`conf`、`kb`、`temp`等全局变量都是用`advancedDict`类型创建的,这些变量分别用于存储路径信息、配置信息、共享对象和临时对象。此外,`queries`用于保存每个DBMS的语句,`...
6. usermacro.get:获取或设置全局变量,为监控脚本提供灵活性。 四、监控接口应用示例 1. 自动发现:编写脚本定期探测网络中的新设备,并通过API自动添加到Zabbix监控中。 2. 自动报警:当系统出现异常时,通过API...
而`$_SERVER`全局变量则包含了与当前请求相关的各种服务器环境变量,如服务器类型、操作系统、HTTP头等。 要确定服务器的操作系统,可以使用`PHP_OS`常量,它返回PHP运行在其上的操作系统名称。例如,如果是Linux,...
为了优化系统性能,文章中提到了利用C脚本和VB全局脚本解决实时通信中的问题。在多变量传输过程中,可能出现PLC内存消耗过大、通信速度慢以及画面更新延迟的现象。通过这两种脚本语言,可以实现对数据传输的优化,...
但是,在最新的 PHP 版本中,自动全局变量是关闭的,为了避免兼容性问题,强迫自己熟悉新的写法。可以使用 $_GET['foo']、$_POST['foo'] 和 $_SESSION['foo'] 来获取变量。 2. 中文参数传递问题 在 Win32 下,使用...
或许孩子们不懂计算机思维中的算法、递归或探测程序这些词语是什么意思,但是他完全可以理解这些基本概念,应用到解题过程,解题速度大增。 元认知能力训练 编程学习也可以帮助孩子提高元认知能力。对于 5-6 岁的...
7. `config`目录:存放了系统配置文件,如数据库连接信息、全局变量、路由设置等,方便开发者调整系统行为。 8. `images`目录:用于存储网站的静态图片资源,包括logo、图标等。 9. `cache`目录:缓存文件存储的...
- **`_gaGlobal`**:全局变量名,用于标识GA相关的全局配置。 - **`_getTime`**:日期对象的方法,返回当前时间的毫秒数。 - **`_toString`**:对象转换为字符串的方法。 - **`_str_window`**、`_length`**:表示...
MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的...