天气好热,不干点事情更是难熬,计划把帝国cms 的系统函数全部搜集到一起。以下为工作笔记。
第一步:遍历目录e,把所有的php文件都保存到一个数组中
帝国cms 的函数集中在目录e下,所以只要遍历整个目录就可以了。代码如下:
<?php function read_all_dir ( $dir ) { $result = array(); $handle = opendir($dir); if ( $handle ) { while ( ( $file = readdir ( $handle ) ) !== false ) { if ( $file != '.' && $file != '..') { $cur_path = $dir . DIRECTORY_SEPARATOR . $file; if ( is_dir ( $cur_path ) ) { $result = array_merge($result,read_all_dir ( $cur_path )); } else { $kzhm=strtolower(pathinfo($cur_path, PATHINFO_EXTENSION)); if($kzhm=='php')$result[] = $cur_path; } } } closedir($handle); } return $result; } print_r(read_all_dir(ECMS_PATH.'e/action/')); ?>
测试了下,还行,就是碰见中文文件名就翻车了,我的php和mysql都用的utf系统,但是不幸的是,我用的xinxp,他的文件是gbk系统的。看来还需要转码了。
思路是,先判断下路径,如果路径里含有gbk编码,就转成utf8。代码为:
$bm=mb_detect_encoding($cur_path, array('ASCII','UTF-8','GB2312','GBK','BIG5')); if($bm=='EUC-CN')$cur_path=iconv('GB2312', 'UTF-8', $cur_path);
这代码一加中文拿下,我测试了下,我的e目录下居然有845个php文件。而且这只是第一步,下一步还要逐个文件分析,我总是担心脚本会超时。那就干脆,最前边加一句:
set_time_limit(0);
第二步,打开某个php文件,读取函数名称。但是无法判断是js函数还是php函数,下暴雨了还凉快,不玩了,直接给出完整的代码吧。
<?php define('EmpireCMSAdmin', '1'); define('InEmpireCMS', '1'); require("../../class/connect.php"); require("../../class/db_sql.php"); require("../../class/functions.php"); // require('../../data/dbcache/class.php'); //验证用户 $link=db_connect(); $empire=new mysqlquery(); $lur=is_login(); set_time_limit(0); //输出格式化后的文件路径 function qpath($path) { $path = str_replace(ECMS_PATH, '', $path); $path ='/'.$path; $path = str_replace(DIRECTORY_SEPARATOR, '/', $path); //过滤win下的路径 $path = str_replace('//', '/', $path); //过滤双斜杠 return $path; } //输出格式化后的文件真实路径 function hpath($path,$qzh=0) { if(!$qzh)$path = ECMS_PATH . $path; $path = str_replace("", '/', $path); $path = str_replace('//', '/', $path); $path = str_replace('/',DIRECTORY_SEPARATOR, $path); return $path; } //获取所有php文件 function get_all_php ( $dir ) { $result = array(); $dir=rtrim($dir,DIRECTORY_SEPARATOR); $handle = opendir($dir); if ( $handle ) { while ( ( $file = readdir ( $handle ) ) !== false ) { if ( $file != '.' && $file != '..') { $cur_path = $dir . DIRECTORY_SEPARATOR . $file; $bm=mb_detect_encoding($cur_path, array('ASCII','UTF-8','GB2312','GBK','BIG5')); if($bm=='EUC-CN')$cur_path=iconv('GB2312', 'UTF-8', $cur_path); if ( is_dir ( $cur_path ) ) { $result = array_merge($result,get_all_php ( $cur_path )); } else { $kzhm=strtolower(pathinfo($cur_path, PATHINFO_EXTENSION)); if($kzhm=='php')$result[] = $cur_path; } } } closedir($handle); } return $result; } $dir='/e/'; $dir=hpath($dir); $phpfiles=get_all_php($dir); $funs=array(); foreach($phpfiles as $filename){ $lines=@file($filename); for($i=0;$i<count($lines);$i++){ $line=trim($lines[$i]); if(substr($line,0,9)=='function '){ $funName=strstr(substr($line,9,-1),'(',true); $lines[$i-1]=trim($lines[$i-1]); if(substr($lines[$i-1],0,2)<>'//')$lines[$i-1]='没有注释,有可能是js函数'; $bm=mb_detect_encoding($lines[$i-1], array('ASCII','UTF-8','GB2312','GBK','BIG5')); if($bm=='EUC-CN')$lines[$i-1]=iconv('GB2312', 'UTF-8', $lines[$i-1]); if(stripos($lines[$i-1],'script')==false)$funs[$funName]=qpath($filename)."#".$lines[$i-1];//.$lines[$i-1]; } } } ksort($funs); // $result=json_encode(($funs)); $str=''; foreach($funs as $key=>$value){ $xxkey=strtolower($key); $str.=<<<jhc ,'{$xxkey}' => '{$value}' jhc; } $str=ltrim($str,','); $str=<<<jhc <?php return array( {$str}); jhc; file_put_contents('data/fundata.php', $str); echo 'ok!'; ?>