zoukankan      html  css  js  c++  java
  • 读取控制器PHP代码文件,并分析数据存到数据库,再重新读出生成PHP文件

    <?php
    namespace apppublicSportcontrollerverify;
    /**
     * 引入基类
     */
    use apppublicSportcontrollercommBackend;
    use thinkDb;
    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] == " ") {
    $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 ]$/', $str[$i])) {
    } else {
    do{
    $i++;
    if (!preg_match('/^[a-zA-Z_0-9\\s ]{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 ]$/', $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 ]{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])." ";
    $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 ]$/', $str[$i])) {
    } else {
    $alldata['class'] = '';
    //往前循环看看有没有abstract,final等词语
    $eachStr = '';
    for ($eachi = $i - 1; $eachi > 0; $eachi--) {
    if ($str[$eachi] == " ") {
    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])." ";
    $ls = '';
    }
    do{
    $i++;
    if ($str[$i] == " ") {
    $alldata['class'] = preg_split('/[s ]/', 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] == " ") {
    $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] == " ") {
    $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] == " ") {
    $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 ]$/', $str[$i])) {
    } else {
    // $func_num = count($alldata['function']);
    //往前循环看看有没有abstract,final等词语
    $eachStr2 = '';
    for ($eachi2 = $i - 1; $eachi2 > 0; $eachi2--) {
    if ($str[$eachi2] == " ") {
    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])." ";
    $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 ]/', $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 ]*?{/', $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 ]*?{/', $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] == " ") {
    $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])." ";
    $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 '-------------------------------------'." ";
    $insert_type = preg_replace('/[s ]*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 ";
    foreach ($rows as $value) {
    switch ($value['type']) {
    case 'namespace':
    $result .= 'namespace ' . $value['content'] . "; ";
    break;
    case 'use':
    $result .= 'use ' . $value['content'] . "; ";
    break;
    case 'block':
    case 'var':
    $result .= $value['content'] . " ";
    break;
    case 'class':
    if ($value['content'] == '}')
    $result .=  $value['content'] . " ";
    else
    $result .= " " . $value['content'] . " {" . " ";
    break;
    case 'function':
    if ($value['content'] == '}')
    $result .= " " . $value['content'] . " ";
    else
    $result .= " " .  $value['content'] . " {" . " ";
    break;
    default:
    break;
    }
    }
    return $result;
    }
    }
  • 相关阅读:
    Win10 64bit 下 Oracle 11g的安装
    删除服务列表中的任意服务 services.msc
    centos7修改docker镜像源的方法
    Docker零基础
    CentOS 查看日志命令
    mac 修改默认python,pip,为python3,pip3
    多次调用摄像头,需要考虑渲染问题
    Ant Designer Vue 中 layout 样式类名丢失
    Windows10 右键假死卡住转圈。
    mac 安装yarn
  • 原文地址:https://www.cnblogs.com/zxj95121/p/8932380.html
Copyright © 2011-2022 走看看