欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

自己练手写的模板引擎

程序员文章站 2022-05-13 17:58:55
...

自己练手写的模板引擎 使用方法: 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#@}