自己练手写的模板引擎
自己练手写的模板引擎 使用方法: 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();
_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)_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_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_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)_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_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_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)_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 _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_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; } } ?>
_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_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; } }
_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 "
------------------
"; //print_r($key2); //echo "
------------------
"; switch ($key2) { case "eq": if($key1==$key3) { $this->_content=$c_a; } else { $this->_content=$c_b; } break; case "=": if($key1==$key3) { //echo "
--------true----------
"; $this->_content=$c_a; } else { //echo "
--------false----------
"; $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 "_content=$c_a; } else { $this->_content=$c_b; } break; case "_content=$c_a; } else { $this->_content=$c_b; } break; default: } } } } public function getContent() { return $this->_content; } }
{@#a5#@} {@#include:/s/t/default/head.html#@}
测试变量1 {@#a1#@}
{@#include:/s/t/default/head.html#@}
{@#a2#@}
{@#a3#@}
{@#a4#@}
{@#if:guoyong > 1#@}
1: {@#a4#@} {@#if:guoyong = 1#@}
1: {@#a4#@}
{@#endif:guoyong#@}
{@#endif:guoyong#@}
{@#a4#@}
{@#if:guoyong 1#@}
2: {@#a4#@}
{@#endif:guoyong#@}
{@#if:guoyong 1#@}
3: {@#a4#@}
{@#endif:guoyong#@}
{@#include:/s/t/default/foot.html#@} {@#for:netlist#@} =====================
{@#netlist.Title#@}
=============================
{@#for:netlist1#@}
{@#netlist1.Title#@}
{@#endfor:netlist1#@} {@#endfor:netlist#@}
**************************
{@#plus:test=fdsafdsafsdafsadfdsfdsafdas#@}
上一篇: 这段代码为什么没执行?解决方法
下一篇: php绘制一条直线的方法_PHP