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

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



PHP email templates: Customize and personalize your email content With the popularity and widespread use of email, traditional email templates can no longer meet people's needs for personalized and customized email content. Now we can create customized and personalized email templates by using PHP programming language. This article will show you how to use PHP to achieve this goal, and provide some specific code examples. 1. Create an email template First, we need to create a basic email template. This template can be an HTM

Regarding PPT masking, many people must be unfamiliar with it. Most people do not understand it thoroughly when making PPT, but just make it up to make what they like. Therefore, many people do not know what PPT masking means, nor do they understand it. I know what this mask does, and I don’t even know that it can make the picture less monotonous. Friends who want to learn, come and learn, and add some PPT masks to your PPT pictures. Make it less monotonous. So, how to add a PPT mask? Please read below. 1. First we open PPT, select a blank picture, then right-click [Set Background Format] and select a solid color. 2. Click [Insert], word art, enter the word 3. Click [Insert], click [Shape]

C++ template specializations affect function overloading and rewriting: Function overloading: Specialized versions can provide different implementations of a specific type, thus affecting the functions the compiler chooses to call. Function overriding: The specialized version in the derived class will override the template function in the base class, affecting the behavior of the derived class object when calling the function.

According to news on October 8, the U.S. auto market is undergoing a change under the hood. The previously beloved six-cylinder and eight-cylinder power engines are gradually losing their dominance, while three-cylinder engines are emerging. News on October 8 showed that the U.S. auto market is undergoing a change under the hood. The beloved six-cylinder and eight-cylinder power engines in the past are gradually losing their dominance, and the three-cylinder engine is beginning to emerge. In most people's minds, Americans love large-displacement models, and the "American big V8" has always been the Synonymous with American cars. However, according to data recently released by foreign media, the landscape of the U.S. auto market is undergoing tremendous changes, and the battle under the hood is intensifying. It is understood that before 2019, the United States

C++ is a programming language widely used in various fields. Its template metaprogramming is an advanced programming technique that allows programmers to transform types and values at compile time. Template metaprogramming is a widely discussed topic in C++, so questions related to it are quite common in interviews. Here are some common template metaprogramming interview questions in C++ that you may be asked. What is template metaprogramming? Template metaprogramming is a technique for manipulating types and values at compile time. It uses templates and metafunctions to generate based on types and values

How to implement image template and mask processing in Vue? In Vue, we often need to perform some special processing on images, such as adding template effects or masks. This article will introduce how to use Vue to achieve these two image processing effects. 1. Image template processing When using Vue to process images, we can use the filter attribute of CSS to achieve template effects. The filter attribute adds graphic effects to the element, and the brightness filter can change the brightness of the picture. we can change

The intelligent NPC created by Academician Huang in "Cyberpunk 2077" can already speak Chinese? Qubit's first-hand experience, witnessing NPCs conversing fluently in both Chinese and English, with natural expressions and movements, and matching mouth shapes... If there wasn't a screen in front of me, it would really feel like being there. . At this year's CES exhibition, Nvidia used its intelligent engine Avatar Cloud Engine (ACE) to make game NPCs "alive", which caused quite a shock. △The intelligent NPC displayed at CES uses ACE. The characters in the game can have realistic voice conversations with players, while showing vivid expressions and body movements without having to prepare a script in advance. At the time of its debut, there were Ubisoft, Tencent, NetEase, MiHoYo and other countries.

Flask-Bootstrap: Adding templates to Flask applications Flask is a lightweight Python web framework that provides a simple and flexible way to build web applications. It is a very popular framework, but its default templates have limited functionality. To create attractive user interfaces, use additional frameworks or libraries. This is where Flask-Bootstrap comes in. Flask-Bootstrap is a Twitter-based
