<?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;
}
}

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

  1. Springboot 上传CSV文件并将数据存入数据库

    .xml文件依赖配置 <!--csv依赖 --> <dependency> <groupId>org.apache.commons</groupId> ...

  2. 2018年,请不要再使用OLE生成EXCEL文件

    输出EXCEL文件是ABAP开发工作中的常见需求,为了学习相关技术,我翻译过一篇文章:使用OLE2对象创建EXCEL文件,并且一度乐在其中. 最近几个月,经过与若干EXCEL打印程序的艰苦斗争,以及对 ...

  3. ASP.NET实现弹出框真分页将复选框选择的数据存到数据库中(四)

    这是第四步点击保存将信息存入数据库中. 这个就简单了利用ajax将JSON字符串传到后台然后这里有个知识点就是将DataTable直接存入数据库中.代码如下: 一.界面获取数据JS代码: //保存订单 ...

  4. WPF根据Oracle数据库的表,生成CS文件小工具

    开发小工具的原因: 1.我们公司的开发是客户端用C#,服务端用Java,前后台在通讯交互的时候,会用到Oracle数据库的字段,因为服务器端有公司总经理开发的一个根据Oracle数据库的表生成的cla ...

  5. 解析Excel文件并把数据存入数据库

    前段时间做一个小项目,为了同时存储多条数据,其中有一个功能是解析Excel并把其中的数据存入对应数据库中.花了两天时间,不过一天多是因为用了"upload"关键字作为URL从而导致 ...

  6. 使用joomla通过CSV文件上传数据存入数据库并使用JavaScript验证码是否符合规则

    1,实现效果截图 2,A.php上传CSV文件表单 2-1:html结构使用jqeury.form.min.js表单框架异步提交 <div class="uploadFile bord ...

  7. Excel数据导入数据库的SQL快速生成

    =CONCATENATE("insert into table_name(id, code, name, remark) values (uuid(),'",B2,"', ...

  8. python xlwt模块生成excel文件并写入数据 xlrd读取数据

    python中一般使用 xlwt (excel write)来生成Excel文件(可以控制单元格格式),用 xlrd 来读取Excel文件,用xlrd读取excel是不能对其进行操作的. 1.xlrd ...

  9. 【JVM】Java中的JavaCore/HeapDump文件及其分析方法

    产生时间 Java程序运行时,有时会产生JavaCore及HeapDump文件,它一般发生于Java程序遇到致命问题的情况下. 有时致命问题发生后,Java应用不会死掉,还能继续运行: 但有时致命问题 ...

随机推荐

  1. centos7-- sbt的安装使用

    sbt是一款类似于maven的构建工具 安装sbt curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo mv bintray- ...

  2. div+css显示两行或三行文字,超出用...表示

    <style> .comment_inner{ width: 200px; word-break: break-all; text-overflow: ellipsis; display: ...

  3. 中文乱码总结之JSP乱码

    一.JSP中文乱码问题 JSP页面的汉字显示为乱码,而英文和阿拉伯数字正常. 二.原因 汉字编码时用的字符集 与解码用的字符集不一致:所有的字符集都兼容ASCII码,所以英文.数字不存在乱码. 编号 ...

  4. Kruskal模板

    Kruskal模板 struct Edge { int from,to,v; }edge[maxn*10]; int fa[maxn]; int n,m; int find(int x) { retu ...

  5. HC32F003与STM8S003资源对比,只是对比,大家评论~!

    枯藤老树昏鸦小桥流水人家                                                古道西风瘦马夕阳西下断肠人在天涯  18年悄然过去!19年向我们走来,蓦然回首过 ...

  6. ie清理缓存

    说废话,直接上图. 1.打开浏览器 2.工具--->Internet选项 3.常规--->设置 4.Internet临时文件--->查看文件 5.将缓存文件夹中内容全部删除

  7. C# DataTable 转 实体类

    C# 中查询结果DataTable转实体类: 比如:List<RtmInterview> rtmList = GetDataById( id); public List<RtmInt ...

  8. [daily][archlinux] TODO LIST

    reminder: https://wikemacs.org/wiki/Buffer_management TO READ: https://www.kernel.org/doc/htmldocs/k ...

  9. linux中MTDflash设备驱动大概

    一.主要结构体 1.mtd_info,主要是描述MTD原始设备层中的设备或分区, 2.mtd_part,表示一个分区,用里面的主mtd_info和本分区mtd_info描述分区, 3.mtd_part ...

  10. Windows bat批处理使用

    mkdir commonmkdir datamkdir savemkdir data\tsushima_m_mapmkdir save\tsushima_m_map msxsl ..\common\r ...