自己练手写的模板引擎 使用方法: include(SITE_PATH./b/GyT.php); $t=new GyT(); $t-setGyiCharset(utf-8); $t-setFrontSeparator({@#); $t-setBackSeparator(#@}); //设置显示的文件名 $t-setInVtrParameter(a1, guoyong我是1); $t-setInVtrParameter(a2, g
自己练手写的模板引擎
使用方法:
include(SITE_PATH."/b/GyT.php");
$t=new GyT();
$t->setGyiCharset("utf-8");
$t->setFrontSeparator("{@#");
$t->setBackSeparator("#@}");
//设置显示的文件名
$t->setInVtrParameter("a1", "guoyong我是1");
$t->setInVtrParameter("a2", "guoyong我是2");
$t->setInVtrParameter("a3", "guoyong我是3");
$t->setInVtrParameter("a4", "guoyong我是4");
$t->setInVtrParameter("a5", "guoyong我是5");
$t->setInIfParameter("guoyong", 1);
$a=array(
array("Id"=>"1","Title"=>"测试一下1"),
array("Id"=>"2","Title"=>"测试一下2"),
array("Id"=>"3","Title"=>"测试一下3"),
array("Id"=>"4","Title"=>"测试一下4"),
array("Id"=>"5","Title"=>"测试一下5")
);
$b=array(
array("Id"=>"1","Title"=>"测试一下1"),
array("Id"=>"2","Title"=>"测试一下2"),
array("Id"=>"3","Title"=>"测试一下3"),
array("Id"=>"4","Title"=>"测试一下4"),
array("Id"=>"5","Title"=>"测试一下5")
);
$t->setInForParameter("netlist", $a);
$t->setInForParameter("netlist1", $b);
$FileName=SITE_PATH."/s/t/default/index1.html";
$t->setFile($FileName);
$t->parse();
echo $t->Out();
<?php include(SYSTEM_PATH.'/b/GyIf.php'); include(SYSTEM_PATH.'/b/GyFor.php'); class GyT { private $_gyFile = ""; private $_gyFrontSeparator = "{"; private $_gyBackSeparator = "}"; private $_gyiCharset; private $_gyInVar=array(); private $_gyInFor=array(); private $_gyInIf=array(); private $_gyContent = ""; private $_gyParameterArray; private function getContent() { if(isset($this->_gyContent)) { return($this->_gyContent); }else { return(NULL); } } private function setContent($content) { $this->_gyContent = $content; } private function getGyiCharset() { if(isset($this->_gyiCharset)) { return($this->_gyiCharset); } else { return(NULL); } } public function setGyiCharset($gyiCharset) { $this->_gyiCharset = $gyiCharset; } public function setFrontSeparator($gytemp) { $this->_gyFrontSeparator = $gytemp; } private function getFrontSeparator() { return $this->_gyFrontSeparator; } public function setBackSeparator($gytemp) { $this->_gyBackSeparator = $gytemp; } private function getBackSeparator() { return $this->_gyBackSeparator; } public function setFile($gyfile) { $this->_gyFile = $gyfile; } private function getFile() { return $this->_gyFile; } public function setInVtrParameter($ParameterName, $ParameterVale) { //判断键是否存在 if (array_key_exists($ParameterName,$this->_gyInVar)) { //已经存在 $this->_gyInVar[$ParameterName]=$ParameterVale; } else { //不存在 $tempA=array($ParameterName=>$ParameterVale); $tempB=$this->_gyInVar; $this->_gyInVar=array_merge($tempA,$tempB); } } public function setInIfParameter($ParameterName, $ParameterVale) { //判断键是否存在 if (array_key_exists($ParameterName,$this->_gyInIf)) { //已经存在 $this->_gyInIf[$ParameterName]=$ParameterVale; } else { //不存在 $tempA=array($ParameterName=>$ParameterVale); $tempB=$this->_gyInIf; $this->_gyInIf=array_merge($tempA,$tempB); } } public function setInForParameter($ParameterName, $ParameterVale) { if (array_key_exists($ParameterName,$this->_gyInFor)) { //已经存在 $this->_gyInFor[$ParameterName]=$ParameterVale; } else { //不存在 $tempA=array($ParameterName=>$ParameterVale); $tempB=$this->_gyInFor; $this->_gyInFor=array_merge($tempA,$tempB); } } public function GyT() { } private function GYReadFile($filename) { $content=file_get_contents($filename); if(is_null($this->getGyiCharset())==TRUE) { $content = iconv($this->getGyiCharset(),"UTF-8//IGNORE",$content); } return $content; } public function parse() { try { $this->setContent($this->GYReadFile($this->_gyFile)); //处理标签 $GySplitA=explode($this->_gyFrontSeparator, $this->_gyContent); if(count($GySplitA)<=1) { //没有需要处理的变量 } else { for($i=1,$temp_count=count($GySplitA); $i<$temp_count; $i++) { $GySplitB=explode($this->_gyBackSeparator, $GySplitA[$i]); $this->_gyParameterArray[($i-1)]=$GySplitB[0]; } $this->RepInclude(); // 处理判断 $this->RepIf(); // 处理循环 $this->RepFor(); // 处理插件 //$this->RepPlus(); // 处理替换的标签 $this->RepString(); } } catch (Exception $e) { print $e->getMessage(); exit; } } private function RepInclude(){ $tempS=$this->_gyContent; $tempCountA=count($this->_gyParameterArray); $deletekey=array(); for($i=0;$i<=$tempCountA;$i++) { if(substr_count($this->_gyParameterArray[$i],"include:")>0) { //获取包含的文件内容 $tempPath=str_replace("include:","",$this->_gyParameterArray[$i]); $tempContent=$this->GYReadFile(SYSTEM_PATH.$tempPath); $tempS=str_replace($this->_gyFrontSeparator.$this->_gyParameterArray[$i].$this->_gyBackSeparator,$tempContent,$tempS); $deletekey[]=$this->_gyParameterArray[$i]; } } $this->setContent($tempS); } private function RepString() { $tempS=$this->_gyContent; $tempParameterArray=$this->_gyInVar; $tempCountA=count($this->_gyParameterArray); $deletekey=array(); for($i=0;$i<=$tempCountA;$i++) { //对变量循环,看看有没有符合的变量,符合的进行替换 if(substr_count($this->_gyParameterArray[$i],":")==0) { foreach ($tempParameterArray as $key => $value) { if($key==$this->_gyParameterArray[$i]) { $tempS=str_replace($this->_gyFrontSeparator.$key.$this->_gyBackSeparator,$value,$tempS); $deletekey[]=$key; $tempParameterArray=$this->gydeletearraykey($tempParameterArray,$key); } } } } $this->setContent($tempS); } private function RepIf(){ $tempS=$this->_gyContent; $GySplitA=explode($this->_gyFrontSeparator."endif:", $tempS); if(count($GySplitA)<=1) { //没有需要处理的变量 } else { for($i=1,$temp_count=count($GySplitA); $i<$temp_count; $i++) { $GySplitF=explode($this->_gyFrontSeparator."endif:", $tempS); $mainkey=""; $GySplitB=explode($this->_gyBackSeparator, $GySplitF[1]); $mainkey=$GySplitB[0]; $tempGySplit=$GySplitF[0]; $GySplitD=explode($this->_gyFrontSeparator."if:", $GySplitF[0]); $GySplitE=explode($this->_gyBackSeparator,$GySplitD[(count($GySplitD)-1)]); $key=$GySplitE[0]; $tempSpStart=""; $tempSpEnd=""; $tempSpIf=""; $tempMain_2=explode($this->_gyFrontSeparator."endif:".$mainkey.$this->_gyBackSeparator, $tempS); for($k=1;$k<count($tempMain_2);$k++) { $tempSpEnd=$tempSpEnd.$tempMain_2[$k].$this->_gyFrontSeparator."endif:".$mainkey.$this->_gyBackSeparator; } $tempSpEnd=substr($tempSpEnd,0,strlen($tempSpEnd)-strlen($this->_gyFrontSeparator."endif:".$mainkey.$this->_gyBackSeparator)); //获取第一个 $tempMain_3=explode($this->_gyFrontSeparator."if:".$key.$this->_gyBackSeparator, $tempMain_2[0]); $tempSpIf=$tempMain_3[(count($tempMain_3)-1)]; for($k=0;$k<(count($tempMain_3)-1);$k++) { $tempSpStart=$tempSpStart.$tempMain_3[$k].$this->_gyFrontSeparator."if:".$key.$this->_gyBackSeparator; } $tempSpStart=substr($tempSpStart,0,strlen($tempSpStart)-strlen($this->_gyFrontSeparator."if:".$key.$this->_gyBackSeparator)); foreach ($this->_gyInIf as $ifkey => $ifvalue) { if($mainkey==$ifkey) { //调用if类进行处理 $igyif=new GyIf(); $igyif->setTempValue($ifvalue); $igyif->setgyParameter($key); $igyif->settempSpStart($tempSpStart); $igyif->settempSpEnd($tempSpEnd); $igyif->settempSpIf($tempSpIf); $igyif->setgyFrontSeparator($this->_gyFrontSeparator); $igyif->setgyBackSeparator($this->_gyBackSeparator); $igyif->Parse(); $tempS=$igyif->getContent(); } } } } $this->setContent($tempS); } private function RepFor(){ $tempS=$this->_gyContent; $GySplitA=explode($this->_gyFrontSeparator."endfor:", $tempS); if(count($GySplitA)<=1) { //没有需要处理的变量 } else { for($i=1,$temp_count=count($GySplitA); $i<$temp_count; $i++) { $GySplitF=explode($this->_gyFrontSeparator."endfor:", $tempS); $mainkey=""; $GySplitB=explode($this->_gyBackSeparator, $GySplitF[1]); $mainkey=$GySplitB[0]; $tempGySplit=$GySplitF[0]; $GySplitD=explode($this->_gyFrontSeparator."for:", $GySplitF[0]); $GySplitE=explode($this->_gyBackSeparator,$GySplitD[(count($GySplitD)-1)]); $key=$GySplitE[0]; $tempSpStart=""; $tempSpEnd=""; $tempSpFor=""; $tempMain_2=explode($this->_gyFrontSeparator."endfor:".$mainkey.$this->_gyBackSeparator, $tempS); for($k=1;$k<count($tempMain_2);$k++) { $tempSpEnd=$tempSpEnd.$tempMain_2[$k].$this->_gyFrontSeparator."endfor:".$mainkey.$this->_gyBackSeparator; } $tempSpEnd=substr($tempSpEnd,0,strlen($tempSpEnd)-strlen($this->_gyFrontSeparator."endfor:".$mainkey.$this->_gyBackSeparator)); //获取第一个 $tempMain_3=explode($this->_gyFrontSeparator."for:".$key.$this->_gyBackSeparator, $tempMain_2[0]); $tempSpFor=$tempMain_3[(count($tempMain_3)-1)]; for($k=0;$k<(count($tempMain_3)-1);$k++) { $tempSpStart=$tempSpStart.$tempMain_3[$k].$this->_gyFrontSeparator."for:".$key.$this->_gyBackSeparator; } $tempSpStart=substr($tempSpStart,0,strlen($tempSpStart)-strlen($this->_gyFrontSeparator."for:".$key.$this->_gyBackSeparator)); foreach ($this->_gyInFor as $forkey => $forvalue) { if($mainkey==$forkey) { $igyfor=new GyFor(); $igyfor->setTempValue($forvalue); $igyfor->setgyParameter($key); $igyfor->settempSpStart($tempSpStart); $igyfor->settempSpEnd($tempSpEnd); $igyfor->settempSpFor($tempSpFor); $igyfor->setgyFrontSeparator($this->_gyFrontSeparator); $igyfor->setgyBackSeparator($this->_gyBackSeparator); $igyfor->Parse(); $tempS=$igyfor->getContent(); } } } } $this->setContent($tempS); } private function gydeletearraykey($sArray,$key){ $tempA=$sArray; if (array_key_exists($key,$tempA)) { unset($tempA[$key]); } return $tempA; } private function gydeletearrayvalue($sArray,$value){ $tempA=$sArray; unset($tempA[array_search($value,$tempA)]); return $tempA; } private function gyshuffle($sArray) { $tempA=$sArray; $tempB=array(); $i=0; foreach ($tempA as $key => $value) { $tempB[$i]=$value; $i++; } return $tempB; } public function Out(){ return $this->_gyContent; } } ?>
<?php class GyFor { private $_content="";//返回值 private $_gyFrontSeparator = "{"; private $_gyBackSeparator = "}"; //private $_gyParameter=array();//主体数组结构由6个变量组成,1主内容。2维度。3start主体。4end主体。5mainkey。6key private $_gyParameter="";//表达式 // 循环前的字符串 private $_tempSpStart=""; // 循环后的字符串 private $_tempSpEnd=""; // 循环的字符串 private $_tempSpFor=""; private $_tempValue=""; public function GyFor() { $this->_content=""; } public function setgyFrontSeparator($gyFrontSeparator) { $this->_gyFrontSeparator=$gyFrontSeparator; } public function setgyBackSeparator($gyBackSeparator) { $this->_gyBackSeparator=$gyBackSeparator; } public function setTempValue($tempValue) { $this->_tempValue=$tempValue; } public function setgyParameter($gyParameter) { $this->_gyParameter=$gyParameter; } public function settempSpStart($tempSpStart) { $this->_tempSpStart=$tempSpStart; } public function settempSpEnd($tempSpEnd) { $this->_tempSpEnd=$tempSpEnd; } public function settempSpFor($tempSpFor) { $this->_tempSpFor=$tempSpFor; } public function Parse() { if(is_array($this->_tempValue)==true) { //判断数组维数 $weidu=$this->arrayLevel($this->_tempValue); if($weidu==1) { //如果是1维数组,则直接替换就ok foreach ($this->_tempValue as $forkey => $forvalue) { $tkey=$this->_gyFrontSeparator.$this->_gyParameter.".".$forkey.$this->_gyBackSeparator; $this->_tempSpFor=str_replace($tkey, $forvalue, $this->_tempSpFor); } $this->_content=$this->_tempSpStart.$this->_tempSpFor.$this->_tempSpEnd; } elseif($weidu==2) { $tempS=""; $tempT=""; //如果是2维数组,则循环替换 for($i=0,$tc=count($this->_tempValue,0);$i<$tc;$i++) { $tempT=$this->_tempSpFor; foreach ($this->_tempValue[$i] as $forkey => $forvalue) { $tkey=$this->_gyFrontSeparator.$this->_gyParameter.".".$forkey.$this->_gyBackSeparator; $tempT=str_replace($tkey, $forvalue, $tempT); } $tempS=$tempS.$tempT; } $this->_content=$this->_tempSpStart.$tempS.$this->_tempSpEnd; } else { $this->_content=$this->_tempSpStart.$this->_tempSpEnd; } } else { $this->_content=$this->_tempSpStart.$this->_tempSpEnd; } } /** * 返回数组的维度 * @param [type] $arr [description] * @return [type] [description] */ function arrayLevel($arr) { $al = array(0); $this->aL($arr,$al); return max($al); } function aL($arr,&$al,$level=0) { if(is_array($arr)){ $level++; $al[] = $level; foreach($arr as $v) { $this->aL($v,$al,$level); } } } public function getContent() { return $this->_content; } }
<?php class GyIf { private $_content="";//返回值 private $_gyParameter="";//表达式 // 循环前的字符串 private $_tempSpStart=""; // 循环后的字符串 private $_tempSpEnd=""; // 循环的字符串 private $_tempSpIf=""; private $_tempValue=""; private $_gyFrontSeparator = "{"; private $_gyBackSeparator = "}"; public function GyIf() { $this->_content=""; } public function setgyFrontSeparator($gyFrontSeparator) { $this->_gyFrontSeparator=$gyFrontSeparator; } public function setgyBackSeparator($gyBackSeparator) { $this->_gyBackSeparator=$gyBackSeparator; } public function setTempValue($tempValue) { $this->_tempValue=$tempValue; } public function setgyParameter($gyParameter) { $this->_gyParameter=$gyParameter; } public function settempSpStart($tempSpStart) { $this->_tempSpStart=$tempSpStart; } public function settempSpEnd($tempSpEnd) { $this->_tempSpEnd=$tempSpEnd; } public function settempSpIf($tempSpIf) { $this->_tempSpIf=$tempSpIf; } public function Parse() { $c_a=$this->_tempSpStart.$this->_tempSpIf.$this->_tempSpEnd; $c_b=$this->_tempSpStart.$this->_tempSpEnd; //对表达式进行分析 判断是否含有空格 if(substr_count($this->_gyParameter," ")==0) { //如果不含有表达式,判断当前值的真假 if(isset($this->_tempValue)) { if($this->_tempValue==true) { $this->_content=$c_a; } else { $this->_content=$c_b; } } else { $this->_content=$c_b; } } else { $mainkey=explode(" ", $this->_gyParameter); if(count($mainkey)==2) { if($this->_tempValue==$mainkey[1]) { $this->_content=$c_a; } else { $this->_content=$c_b; } } else { $key1=$this->_tempValue; $key2=$mainkey[1];//表达式 $key3=$mainkey[2]; //echo "<br>------------------<br>"; //print_r($key2); //echo "<br>------------------<br>"; switch ($key2) { case "eq": if($key1==$key3) { $this->_content=$c_a; } else { $this->_content=$c_b; } break; case "=": if($key1==$key3) { //echo "<br>--------true----------<br>"; $this->_content=$c_a; } else { //echo "<br>--------false----------<br>"; $this->_content=$c_b; } break; case ">": if($key1 > $key3) { $this->_content=$c_a; } else { $this->_content=$c_b; } break; case ">=": if($key1 >= $key3) { $this->_content=$c_a; } else { $this->_content=$c_b; } break; case "<": if($key1 < $key3) { $this->_content=$c_a; } else { $this->_content=$c_b; } break; case "<=": if($key1 <= $key3) { $this->_content=$c_a; } else { $this->_content=$c_b; } break; default: } } } } public function getContent() { return $this->_content; } }
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>{@#a5#@}</title> </head> <body> {@#include:/s/t/default/head.html#@} <br /> 测试变量1 {@#a1#@} <br /> {@#include:/s/t/default/head.html#@} <br /> {@#a2#@} <br /> {@#a3#@} <br /> {@#a4#@} <br /> <br /> {@#if:guoyong > 1#@} <br />1: {@#a4#@} {@#if:guoyong = 1#@} <br />1: {@#a4#@} <br /> {@#endif:guoyong#@} <br /> {@#endif:guoyong#@} <br /> {@#a4#@} <br /> {@#if:guoyong 1#@} <br />2: {@#a4#@} <br /> {@#endif:guoyong#@} <br /> <br /> {@#if:guoyong 1#@} <br />3: {@#a4#@} <br /> {@#endif:guoyong#@} <br /> {@#include:/s/t/default/foot.html#@} {@#for:netlist#@} ===================== <br> <a href="/article.jsp?articleid={@#netlist.Id#@}" title="{@#netlist.Title#@}">{@#netlist.Title#@}</a> <br> ============================= <br> {@#for:netlist1#@} <br> <a href="/article.jsp?articleid={@#netlist1.Id#@}" title="{@#netlist1.Title#@}">{@#netlist1.Title#@}</a> <br> {@#endfor:netlist1#@} {@#endfor:netlist#@} <br /> ************************** <br /> <br /> <br /> <br /> {@#plus:test=fdsafdsafsdafsadfdsfdsafdas#@} <br /> <br /> <br /> <br /> <br /> </body> </html>