1、分析需求:直接以字节流形式修改laravel框架中config文件夹下的配置文件,不影响注解语言:php知识点:文件存储方式、文件io读写、栈使用思路:直接读取文件,找到key的指针位和旧值的长度,然后通过fwrite覆盖问题:如何排除评论里的内容?答:使用栈存储Popup评论符号,忽略评论解析。如果存在相同的键,如何区分不同的数组?答:对于倒数第二个key,先存一个“[”,循环读取“]”结束。如果有value==key就会报错,怎么解决?答:从当前位置开始,搜索“=>”判断是键还是值。fwrite写覆盖,长短替换,短长替换出现格式错误,如何解决?答:临时保存值后的数据然后清空,写一个新值再连接临时数据。兼容某些格式?比如字符之间没有空格,有换行逗号等。答:对空格,换行,逗号进行处理。调用方式:配置文件bank.php中test['a']['b']=1,调用ConfigHelper::setOrigin(config_path("bank.php"),"test.a.b","test")后,修改1测试2.例子+代码1.配置文件内容:5,//是否绑定单个银行账户false=>多个,true=>single'single'=>false,//平台是否绑定单一银行账户false=>multiple,true=>single'single_admin'=>true,"test"=>['a'=>["b"=>1]],"test1"=>['b'=>"b"]];2。代码:publicstaticfunctionsetOrigin(string$filename,$key,$value){try{if(empty($filename)||empty($key)||empty($value)){thrownew\Exception("theparams不为空");}$f=fopen($filename,"r+");$keys=explode(".",$key);$total=count($keys);//替换起始指针位置$start=0;//替换值的长度$length=0;//入栈控制注解字段$stack=[];//入栈控制数组字段$stack1=[];//结束标签$end="";$map=['//'=>"\n",'/*'=>"*/",];foreach($keysas$k=>$val){//兼容""和''$goal1="\""。$瓦尔。"\"";$goal2="'".$val."'";$len=strlen($goal1);while(!feof($f)){$first=fread($f,1);//记录当前位置$pointer=ftell($f);//读取两个字节判断注释$second=$first.fread($f,1);//如果文件结束或超出数组字段则退出if(feof($f)||(count($stack1)>0&&$first=="]")){中断;}//入栈if(array_key_exists($second,$map)){$stack[]=$second;继续;}//弹出if(count($stack)!=0&&($map[$stack[count($stack)-1]]==$first||$map[$stack[count($stack)-1]]==$second)){array_pop($stack);继续;}//获取目标字符串$tmp=$second.恐惧($f,$len-2);//判断是否匹配到目标Stringkeyif(count($stack)==0&&($tmp==$goal1||$tmp==$goal2)){//排除匹配的字符串为value$status=0;//找到行尾看是否有=>while(($equl=fread($f,1))!="="&&($equl!="\n"&&$equl!=",")){}if($equl.fread($f,1)=="=>"){$status=1;}//真正匹配的keyif($status==1){//匹配key后倒数第二个索引有一个数组字段if($total>1&&$k==$total-2){$stack1[]=“[”;}//对于最后一个key,考虑没有空格的情况>if($k==$total-1){while(fread($f,1)==""){}$start=ftell($f)-1;//值的结束标志:换行符或空格or,while(($tag=fread($f,1))!="\n"&&$tag!=""&&$tag!=","){}$end=$tag==","?“”:$标签;$length=ftell($f)-$start;休息;}休息;}}//回到当前位置fseek($f,$pointer);}}//没有找到if($start==0&&$length==0)thrownew\Exception("theconfigisnotfound");//暂存start+lenght后的数据$tmp="";fseek($f,$start+$length);while(!feof($f)){$tmp.=fread($f,2);}//清除后面的数据ftruncate($f,$start);//将指针移动到值位置并写入新值fseek($f,$start);$replace="\"".$value."\",".$结束;fwrite($f,$replace,strlen($replace));//重写以下数据tmpfwrite($f,$tmp,strlen($tmp));fclose($f);}抓住(\Exception$e){thrownew\Exception($e->getMessage().'-'.$e->getLine());}}3.代码优化待续。
