张贤健 安师大张贤健
张贤健的个人网站

读取控制器PHP代码文件,并分析数据存到数据库,再重新读出生成PHP文件

<?php
namespace app\publicSport\controller\verify;
/**
 * 引入基类
 */
use app\publicSport\controller\comm\Backend;
use think\Db;
class Capzxj extends Backend
{
private $dbNumber;
// PS:
// 1、所访问的页面中必须只能有一个类
public function index()
{
$dbNumber = Db::name('source')
->group('number')
->count();
$this->dbNumber = ++$dbNumber;
$path = ROOT_PATH . 'application/publicSport/controller/verify/Captcha.php';
// $path = ROOT_PATH . 'application/publicSport/controller/comm/Backend.php';
// $result = file_get_contents($path);
// var_dump($result);die;
$file = fopen($path, 'r');
$str = '';
while(! feof($file))
{
$s = fgets($file); 
$str .= $s;
// echo $s;
}
fclose($file);
$len = strlen($str);
$newstr = '';
$last = '';
$lastArr = array();//存放刚刚读取的最后20个字符
$quotes = '';//空表示不再引号内,否则值为对应引号
$var = false;//false表示不是变量,true表示正处在一个变量中
$ls = '';//记录之前普通的代码
$alldata = array(
'namespace' => '',
'use' => array(),
'block' => array(),
'function' => array()
);
for($i=0; $i<$len; $i++) {
$skip = false;//是否跳过当前这个字符
/*检测当前代码引号情况*/
if ($str[$i] == '"' || $str[$i] =="'") {
if (!$quotes) {
//说明当前没有进入引号
$quotes =  $str[$i];
} else {
if ($quotes == $str[$i] && $last != "\\") {
//说明是真的遇到结尾了
$quotes = '';
}
}
}
/*去掉//的注释*/
if ($str[$i] == '/' && $last == $str[$i] && !$quotes) {
//去掉最后一个字符
$newstr = substr($newstr, 0, -1);
$ls = substr($ls, 0, -1);
/*删除字符串前面的空格*/
$newstr = trim($newstr);
do{
$i++;
if ($str[$i] == "\n") {
$skip = true;
break;
}
} while(1);
continue;
}
/*去掉/*的注释*/
if ($str[$i] == '*' && $last == '/' && !$quotes) {
$last_last = '/';
$newstr = substr($newstr, 0, -1);
$ls = substr($ls, 0, -1);
/*删除字符串前面的空格*/
$newstr = trim($newstr);
do{
$i++;
if (($str[$i] == '/' && $last_last == '*') || ($i >= $len)) {
$skip = true;
break;
}
$last_last = $str[$i];
} while(1);
continue;
}
/*检测当前是否在某个变量内*/
if ($str[$i] == '$' && !$quotes) {
$var = true;
}
/*监测namespace*/
if (!$var && !$quotes && $lastArr[0] == 'e' && $lastArr[1] == 'c' && $lastArr[2] == 'a' && $lastArr[3] == 'p' && $lastArr[4] == 's' && $lastArr[5] == 'e'&& $lastArr[6] == 'm'&& $lastArr[7] == 'a' && $lastArr[8] == 'n') {
if (!preg_match('/^[\s\t]$/', $str[$i])) {
} else {
do{
$i++;
if (!preg_match('/^[a-zA-Z_0-9\\\\\s\t]{1}$/', $str[$i])) {
$alldata['namespace'] = trim($alldata['namespace']);
$newstr = substr($newstr, 0, -9);
// $ls = substr($ls, 0, -9);
$ls = '';
$skip = true;
$this->saveRow('namespace', $alldata['namespace']);
break;
}
$alldata['namespace'] .= $str[$i];
} while(1);
}
}
/*监测use*/
if (!$var && !$quotes && $lastArr[0] == 'e' && $lastArr[1] == 's' && $lastArr[2] == 'u') {
if (!preg_match('/^[\s\t]$/', $str[$i])) {
} else {
// var_dump(implode('', array_reverse($lastArr)));
$now_useLen = count($alldata['use']);
$alldata['use'][$now_useLen] = '';
do{
$i++;
if (!preg_match('/^[a-zA-Z_0-9\\\\\s\t]{1}$/', $str[$i])) {
$alldata['use'][$now_useLen] = trim($alldata['use'][$now_useLen]);
$this->saveRow('use', $alldata['use'][$now_useLen]);
$newstr = substr($newstr, 0, -4);
$ls = substr($ls, 0, -4);
$skip = true;
if (trim($ls)) {
$block_count = count($alldata['block']);
if (trim(trim($ls), '{')) {
$alldata['block'][$block_count] = trim(trim($ls), '{');
$this->saveRow('block', $alldata['block'][$block_count]);
}
// echo trim($alldata['block'][$block_count])."\n";
$ls = '';
}
break;
}
$alldata['use'][$now_useLen] .= $str[$i];
} while(1);
}
}
//检测是否进入class
if (!$var && !$quotes && $lastArr[0] == 's' && $lastArr[1] == 's' && $lastArr[2] == 'a' && $lastArr[3] == 'l' && $lastArr[4] == 'c') {
if (!preg_match('/^[\s\t]$/', $str[$i])) {
} else {
$alldata['class'] = '';
//往前循环看看有没有abstract,final等词语
$eachStr = '';
for ($eachi = $i - 1; $eachi > 0; $eachi--) {
if ($str[$eachi] == "\n") {
break;
}
$eachStr .=  $str[$eachi];
}
/*将匹配到的旧的全部去掉*/
$newstr = substr($newstr, 0, $eachi-$i);
$ls = substr($ls, 0, $eachi-$i);
$skip = true;
if (trim($ls)) {
$block_count = count($alldata['block']);
if (trim(trim($ls), '{')) {
$alldata['block'][$block_count] = trim(trim($ls), '{');
$this->saveRow('block', $alldata['block'][$block_count]);
}
// echo trim($alldata['block'][$block_count])."\n";
$ls = '';
}
do{
$i++;
if ($str[$i] == "\n") {
$alldata['class'] = preg_split('/[\s\t]/', trim($alldata['class']));
array_unshift($alldata['class'], strrev(trim($eachStr)));
$classStr = trim(implode(' ', $alldata['class']), '{');
$this->saveRow('class', $classStr);
break;
}
$alldata['class'] .= $str[$i];
} while(1);
/*---------------------------------------------------从现在开始进去这个类-------------------------------------------------*/
/*---------------------------------------------------从现在开始进去这个类-------------------------------------------------*/
/*---------------------------------------------------从现在开始进去这个类-------------------------------------------------*/
/*---------------------------------------------------从现在开始进去这个类-------------------------------------------------*/
/*---------------------------------------------------从现在开始进去这个类-------------------------------------------------*/
if (1) {
//构建新的变量
$quotes2 = '';//空表示不再引号内,否则值为对应引号
$var2 = false;//false表示不是变量,true表示正处在一个变量中
// $ceng = 0;//用来表示大括号进入的层级
$ls = '';
$functionNum = 0;
$functionOver = false;
do {
$skip = false;//是否跳过当前这个字符
/*检测当前代码引号情况*/
if ($str[$i] == '"' || $str[$i] =="'") {
if (!$quotes2) {
//说明当前没有进入引号
$quotes2 =  $str[$i];
} else {
if ($quotes2 == $str[$i] && $last != "\\") {
//说明是真的遇到结尾了
$quotes2 = '';
}
}
}
/*去掉//的注释*/
if ($str[$i] == '/' && $last == $str[$i] && !$quotes2) {
//去掉最后一个字符
$newstr = substr($newstr, 0, -1);
$ls = substr($ls, 0, -1);
/*删除字符串前面的空格*/
$newstr = trim($newstr);
do{
$i++;
if ($str[$i] == "\n") {
$skip = true;
break;
}
} while(1);
continue;
}
/*去掉/*的注释*/
if ($str[$i] == '*' && $last == '/' && !$quotes2) {
$last_last = '/';
$newstr = substr($newstr, 0, -1);
$ls = substr($ls, 0, -1);
/*删除字符串前面的空格*/
$newstr = trim($newstr);
do{
$i++;
if (($str[$i] == '/' && $last_last == '*') || ($i >= $len)) {
$skip = true;
break;
}
$last_last = $str[$i];
} while(1);
continue;
}
/*检测当前是否在某个变量内*/
if ($str[$i] == '$' && !$quotes2) {
$var2 = true;
/*去寻找这个类的成员变量*/
//往前循环看看
$varStr = '';
for ($vari = $i; $vari > 0; $vari--) {
if ($str[$vari] == "\n") {
$varStr = strrev($varStr);
break;
}
$varStr .=  $str[$vari];
}
/*将匹配到的旧的全部去掉*/
$newstr = substr($newstr, 0, $vari-$i);
$ls = substr($ls, 0, $vari-$i);
$skip = true;
do {
$i++;
if ($str[$i] == "\n") {
$varStr = trim($varStr);
$this->saveRow('var', $varStr);
$alldata['var'][] = $varStr;
break;
}
$varStr .= $str[$i];
} while (1);
}
//检测是否有function
if (!$var2 && !$quotes2 && $lastArr[0] == 'n' && $lastArr[1] == 'o' && $lastArr[2] == 'i' && $lastArr[3] == 't' && $lastArr[4] == 'c' && $lastArr[5] == 'n' && $lastArr[6] == 'u' && $lastArr[7] == 'f') {
if (!preg_match('/^[\s\t]$/', $str[$i])) {
} else {
// $func_num = count($alldata['function']);
//往前循环看看有没有abstract,final等词语
$eachStr2 = '';
for ($eachi2 = $i - 1; $eachi2 > 0; $eachi2--) {
if ($str[$eachi2] == "\n") {
break;
}
$eachStr2 .=  $str[$eachi2];
}
/*将匹配到的旧的全部去掉*/
$newstr = substr($newstr, 0, $eachi2-$i);
$ls = substr($ls, 0, $eachi2-$i);
$skip = true;
if (trim($ls) && trim($ls) != '}') {
$block_count = count($alldata['block']);
if (trim(trim($ls), '{')) {
$alldata['block'][$block_count] = trim(trim($ls), '{');
$this->saveRow('block', $alldata['block'][$block_count]);
}
// echo trim($alldata['block'][$block_count])."\n";
$ls = '';
}
$alldata['function'][$functionNum] = '';
//构建新的变量
$quotes4 = '';//空表示不再引号内,否则值为对应引号
$var4 = false;//false表示不是变量,true表示正处在一个变量中
$funKV = array();
$funValue = '';
$lastI = $i;
do{
$last = $str[$i];
$i++;
/*检测当前代码引号情况*/
if ($str[$i] == '"' || $str[$i] =="'") {
if (!$quotes4) {
//说明当前没有进入引号
$quotes4 =  $str[$i];
} else {
if ($quotes4 == $str[$i] && $last != "\\") {
//说明是真的遇到结尾了
$quotes4 = '';
}
}
}
/*检测当前是否在某个变量内*/
if ($str[$i] == '$' && !$quotes4 && !$var4) {
$var4 = true;
$funVar = '';
while(1) {
$i++;
if (!preg_match('/[a-zA-Z0-9_\s\t]/', $str[$i])) {
$var4 = false;
if (trim($funVar)) {
$funKV[trim($funVar)] = null;
}
if ($str[$i] != '=') {
$funValue = false;
} else {
$funValue = '';
}
break;
}
$funVar .= $str[$i];
}
}
if ($funValue !== false)
$funValue .= $str[$i];
if (!$var4 && !$quotes4 && ($str[$i] == ',' || $str[$i] == ')')){
$funValue = substr(trim($funValue), 1, -1);
if (trim($funValue)) {
$funKV[trim($funVar)] = trim($funValue);
}
}
$rrrr = trim(trim(trim($alldata['function'][$functionNum]), '{'));
if (!$quotes4 && preg_match('/\)[\s\t\n\r]*?\{/', $alldata['function'][$functionNum])) {
/*不要忘了最后一个变量*/
$funValue = substr(trim($funValue), 0, -1);
if ($funValue) {
$funKV[$funVar] = $funValue;
}
// $alldata['function'][$functionNum] = array('str' => $rrrr);
// $alldata['function'][$functionNum]['prev'] = strrev(trim($eachStr2));
// $this->saveRow('function', $alldata['function'][$functionNum]['prev']. ' ' . $alldata['function'][$functionNum]['str']);
break;
}
$alldata['function'][$functionNum] .= $str[$i];
} while(1);
$i = $lastI;
$alldata['function'][$functionNum] = '';
do{
$i++;
$rrrr = trim(trim(trim($alldata['function'][$functionNum]), '{'));
if (!$quotes4 && preg_match('/\)[\s\t\n\r]*?\{/', $alldata['function'][$functionNum])) {
$alldata['function'][$functionNum] = array('str' => $rrrr);
$alldata['function'][$functionNum]['prev'] = strrev(trim($eachStr2));
$this->saveRow('function', $alldata['function'][$functionNum]['prev']. ' ' . $alldata['function'][$functionNum]['str']);
$functionName = explode('(', $alldata['function'][$functionNum]['str'])[0];
//函数名称 fuunctionName
// var_dump($functionName);
// die;
break;
}
$alldata['function'][$functionNum] .= $str[$i];
} while(1);
// var_dump($funKV);
// die;
/*开始进入function*/
/*---------------------------------------------------entry function-------------------------------------------------*/
/*---------------------------------------------------entry function-------------------------------------------------*/
/*---------------------------------------------------entry function-------------------------------------------------*/
/*---------------------------------------------------entry function-------------------------------------------------*/
/*---------------------------------------------------entry function-------------------------------------------------*/
//构建新的变量
$quotes3 = '';//空表示不再引号内,否则值为对应引号
$var3 = false;//false表示不是变量,true表示正处在一个变量中
$ceng = 0;//用来表示大括号进入的层级
$ls = '';
do {
$skip = false;//是否跳过当前这个字符
/*检测当前代码引号情况*/
if ($str[$i] == '"' || $str[$i] =="'") {
if (!$quotes3) {
//说明当前没有进入引号
$quotes3 =  $str[$i];
} else {
if ($quotes3 == $str[$i] && $last != "\\") {
//说明是真的遇到结尾了
$quotes3 = '';
}
}
}
/*去掉//的注释*/
if ($str[$i] == '/' && $last == $str[$i] && !$quotes3) {
//去掉最后一个字符
$newstr = substr($newstr, 0, -1);
$ls = substr($ls, 0, -1);
/*删除字符串前面的空格*/
$newstr = trim($newstr);
do{
$i++;
if ($str[$i] == "\n") {
$skip = true;
break;
}
} while(1);
continue;
}
/*去掉/*的注释*/
if ($str[$i] == '*' && $last == '/' && !$quotes3) {
$last_last = '/';
$newstr = substr($newstr, 0, -1);
$ls = substr($ls, 0, -1);
/*删除字符串前面的空格*/
$newstr = trim($newstr);
do{
$i++;
if (($str[$i] == '/' && $last_last == '*') || ($i >= $len)) {
$skip = true;
break;
}
$last_last = $str[$i];
} while(1);
continue;
}
/*检测当前是否在某个变量内*/
if ($str[$i] == '$' && !$quotes3) {
$var3 = true;
}
if (!$var3 && !$quotes3 && $str[$i] == '{') {
$ceng++;
}
//检查当前是否离开某个变量
if ($var3 && !preg_match('/[a-zA-Z0-9_]/', $str[$i])) {
$var3 = false;
// echo ++$kaa;
}
if (array_unshift($lastArr, $str[$i]) > 20) {
array_pop($lastArr);
}
$last = $str[$i];
if (!$var3 && !$quotes3 && $str[$i] == '}') {
$ceng--;
// echo $ceng;
// var_dump(strrev(implode('', $lastArr)));
if ($ceng < 0) {
//计算这个function中的block
if (trim($ls)) {
$block_count = count($alldata['block']);
if (trim(trim($ls), '{')) {
$alldata['block'][$block_count] = trim(trim($ls), '{');
$this->saveRow('block', $alldata['block'][$block_count]);
}
// echo trim($alldata['block'][$block_count])."\n";
$ls = '';
}
$i++;
break;
}
}
if (!$skip) {
$newstr .= $str[$i];
$ls .= $str[$i];
}
$i++;
} while(1);
$this->saveRow('function', '}');
/*---------------------------------------------------O U T function-------------------------------------------------*/
/*---------------------------------------------------O U T function-------------------------------------------------*/
/*---------------------------------------------------O U T function-------------------------------------------------*/
/*---------------------------------------------------O U T function-------------------------------------------------*/
/*---------------------------------------------------O U T function-------------------------------------------------*/
// var_dump($funKV);
// echo '-------------------------------------'."\n\n";
$insert_type = preg_replace('/[\s\t\n\r]*function/', '', $alldata['function'][$functionNum]['prev']);
// var_dump($insert_type);
foreach ($funKV as $s => $t) {
$insert_l = array();
$insert_l['number'] = $this->dbNumber;
$insert_l['type'] = $insert_type;
$insert_l['name'] = $functionName;
$insert_l['var'] = $s;
$insert_l['val'] = $t;
$insert[] = $insert_l;
}
$functionNum++;
}
}
// echo $str[$i];
//检查当前是否离开某个变量
if ($var2 && !preg_match('/[a-zA-Z0-9_]/', $str[$i])) {
$var2 = false;
// echo ++$kaa;
}
if (array_unshift($lastArr, $str[$i]) > 20) {
array_pop($lastArr);
}
$last = $str[$i];
if (!$skip) {
$newstr .= $str[$i];
$ls .= $str[$i];
}
if ($str[$i] == '}') {
$functionOver = false;
break;
}
$i++;
} while(1);
$this->saveRow('class', '}');
}
/*----------------------------------------------------------over类--------------------------------------------------------*/
/*----------------------------------------------------------over类--------------------------------------------------------*/
/*----------------------------------------------------------over类--------------------------------------------------------*/
/*----------------------------------------------------------over类--------------------------------------------------------*/
/*----------------------------------------------------------over类--------------------------------------------------------*/
}
}
/*检测public 或者 private 或者protected */
// final abstract implents
//检查当前是否离开某个变量
if ($var && !preg_match('/[a-zA-Z0-9_]/', $str[$i])) {
$var = false;
// echo ++$kaa;
}
if (array_unshift($lastArr, $str[$i]) > 25) {
array_pop($lastArr);
}
$last = $str[$i];
if (!$skip) {
$newstr .= $str[$i];
$ls .= $str[$i];
}
// echo $str[$i];
}
// echo $newstr;
// preg_match_all('/namespace.+?\;/', $newstr, $namespace);
Db::name('source_function')->insertAll($insert);
/*从数据读出数据并echo出来*/
echo $this->saveFile($this->dbNumber);
}
private function saveRow($type, $content)
{
Db::name('source')->insert(
['type' => $type, 'content' => $content, 'number' => $this->dbNumber]
);
}
private function saveFile($number)
{
$rows = Db::name('source')
->where('number', $number)
->select();
$result = "<?php\n";
foreach ($rows as $value) {
switch ($value['type']) {
case 'namespace':
$result .= 'namespace ' . $value['content'] . ";\n\n";
break;
case 'use':
$result .= 'use ' . $value['content'] . ";\n";
break;
case 'block':
case 'var':
$result .= $value['content'] . "\n";
break;
case 'class':
if ($value['content'] == '}')
$result .=  $value['content'] . "\n";
else
$result .= "\n" . $value['content'] . "\n{" . "\n\t";
break;
case 'function':
if ($value['content'] == '}')
$result .= "\t" . $value['content'] . "\n";
else
$result .= "\n\t" .  $value['content'] . "\n\t{" . "\n\t\t";
break;
default:
break;
}
}
return $result;
}
}
posted @ 2018-04-24 18:05  张贤健  阅读(488)  评论(0编辑  收藏