晒一下我的模板引擎,欢迎拍砖

澳门葡亰赌场网址,别不多说,直接上代码template.php

?phpclasstemplate{protected$data=array();protected$drillmode=0;function__construct($s){if(file_exists($s))$s=file_get_contents($s);$this-find_var($s);$this-data=explode('',$s);$this-data[0]='?php$_st=$_var=array();?';$this-find_dsn();}//新增run方法,functionrun(){//include"data://,".join('',$this-data);eval('?'.join('',$this-data));}functionfind($pattern){$this-pattern=$pattern;returnarray_filter($this-data,array($this,'find_callback'));}privatefunctionfind_dsn(){foreach($this-find("#bdsnb#i")as$k=$v){$t=$this-find_tag($tag=strtok($v,''),$k);end($t);$dsn[]=array($k,key($t));}if($this-drillmode){foreach($this-find("#bdrillb#i")as$k=$t){foreach($dsnas$i=$v)if($k$v[1]$k$v[0])$t=$i;$drill[]=$dsn[$t];unset($dsn[$t]);}}foreach($dsnas$v){list($start,$end)=$v;preg_match('/bdsns*=s*([^s]+)/i',$this-data[$start],$reg);$this-data[$start]=str_replace(''.$reg[0],'',$this-data[$start]);$m=explode(',',trim($reg[1],''"'))+array(0,0,'');$code_start="?phpif(isset($_var))$_st[]=$_var;foreach((isset($_var['$m[0]'])?$_var['$m[0]']:$this-$m[0]('$m[1]','$m[2]'))as$_key=$_var){?";$code_end="?php}$_var=array_pop($_st);?";switch($m[1]){case0:$t=explode('',$this-data[$start]);$t[1]="$code_start".$t[1];$this-data[$start]=join('',$t);$this-data[$end]="$code_end".$this-data[$end];break;case1:$this-data[$end].="$code_end";$this-data[$start]="$code_start".$this-data[$start];break;default:$n=round(100/$m[1]);$this-data[$end].="/dt$code_end";$this-data[$start]="$code_startdtstyle='float:left;width:$n%;margin:0px;padding:0px'".$this-data[$start];break;}}if($this-drillmode)foreach($drillas$v){list($start,$end)=$v;preg_match('/bdsns*=s*([^s]+)/i',$this-data[$start],$reg);$this-data[$start]=str_replace(''.$reg[0],'',$this-data[$start]);$m=explode(',',trim($reg[1],''"'))+array(0,0,'');$code='';for($i=$start;$i=$end;$i++){$code.=''.$this-data[$i];if($i$start)unset($this-data[$i]);}$code=addslashes($code);$this-data[$start]="?php$_code='$code';$this-drill($_code,isset($_var['$m[0]'])?$_var['$m[0]']:$this-$m[0]('$m[1]','$m[2]'));?";}}protectedfunctionfind_tag($tag,$offs=0){$r=array();$counter=0;foreach($this-find("#^/?$tag#i")as$k=$v){if($k=$offs){$counter+=$v{0}=='/'?1:-1;$r[$k]=$v;if($counter==0)break;}}return$r;}protectedfunctionfind_callback($v){returnpreg_match($this-pattern,$v);}privatefunctionfind_var($s){$s=preg_replace_callback('/{(w+)}/',array($this,'var_callback'),$s);}protectedfunctionvar_callback($r){if($r[1]=='drill'){$this-drillmode++;return'?phpif(isset($_var['child']))$this-drill($_code,$_var['child']);?';}return"?phpechoisset($_var['$r[1]'])?$_var['$r[1]']:'';?";}protectedfunctiondrill($_code,$_source){if(empty($_source)||!is_array($_source))returnarray();foreach($_sourceas$_key=$_var){//include'data://,'.$_code;eval('?'.$_code);}}function__call($func,$param){if(function_exists($func))returncall_user_func_array($func,$param);returnarray();}function__toString(){returnjoin('',$this-data);}}

补充一下模板中只有两种控制元素:1、模板变量用花括号括起的变量名,如{var}。提供数据的函数应提供对应的数据,如没有提供则自动为空2、数据源声明位于HTML标记中的dsn属性,比如pdsn=’foo,1′{t}/p其中foo表示提供数据的函数,1表示充填数据时,循环是包含自身的比如返回的数据是array(array(‘t’=1,array(‘t’=2))则实际生成的html是p1/pp2/p当第二个参数缺省时,同样的数据只产生p12/p3、数据源函数约定返回的是二维数组:第一维是下标数组,第二维是关联数组。请参见测试例写程序很简单,写文档就要了我的命了相关问题解答见#39一个扩展的用法见#61

相关文章