读取控制器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;

}

}