假设使用标签形式作为模板语法在解析环节我想到两种实现方式1.利用正则获取标签内容,然后将标签进行规则性的替换并使用eval进行解析,解析完成后再用正则进行替换2.利用正则获取标签内容,然后将标签进行规则性的替换,替换完成后使用cli执行脚本并返回内容现在的问题是,不太清楚整个流程和这两种实现方式是否正确,或者有别的方式。谢谢
2 回答
一只斗牛犬
TA贡献1784条经验 获得超2个赞
简单理解一下,是这样的//file.php$var='text';include'file.html';``````=$var?>file.html就是file.php的模板再换个思路是这样的//file.php$var='text';#complietemplateif(!is_file('template_file.php')){$contents=file_get_contents('file.html');$contents=preg_replace(.....);file_put_contents('template_file.php',$contents);}include'template_file.php';{{var}}
梵蒂冈之花
TA贡献1900条经验 获得超5个赞
举个简单的列子给你吧/*****************核心文件*@discription:编写简单的模板引擎*/define('INVIEW',true);classview{var$tpl_dir='template';var$cache_dir='cache';var$tpl_ext='.html';var$var_left='{';var$var_right='}';function__construct($config=array()){extract($config);if(isset($tpl_dir))$this->tpl_dir=$tpl_dir;if(isset($cache_dir))$this->cache_dir=$cache_dir;if(isset($tpl_ext))$this->tpl_ext=$tpl_ext;if(isset($var_left))$this->var_left=$var_left;if(isset($var_right))$this->var_right=$var_right;}functionload($tplfilename){$tplfile=$this->tpl_dir.'/'.$tplfilename.$this->tpl_ext;if(!file_exists($tplfile))die('Templatenotfound:'.$tplfile);return$this->cache($tplfilename,$tplfile);}//判断模板是否缓存,如模板文件有更改则重新编译functioncache($tplname,$tpl_file){$cache_file=$this->cache_dir.'/'.md5($tplname).'.php';if(!file_exists($cache_file)||filemtime($tpl_file)>filemtime($cache_file))$this->compile($tpl_file,$cache_file);return$cache_file;}//编译模板内容到PHP格式,并写入缓存functioncompile($tpl,$cache){$body=file_get_contents($tpl);$vl=$this->var_left;$vr=$this->var_right;$patterns=array("#$vl\s*include:(.+?)\s*$vr#i","#$vl\s*if\s+(.+?)\s*$vr#i","#$vl\s*else\s*$vr#i","#$vl\s*elseif\s+(.+?)\s*$vr#i","#$vl\s*endif\s*$vr#i","#$vl\s*/if\s*$vr#i","#$vl\s*foreach\s+(.+?):(.+?)\s*$vr#i","#$vl\s*endforeach\s*$vr#i","#$vl\s*/foreach\s*$vr#i","#$vl([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)$vr#i","#$vl([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)$vr#i","#$vl([0-9a-zA-Z_\[\]\'\"]+?)$vr#i","#$vl([0-9a-zA-Z_]+?):(.*?)$vr#i");$replacements=array("","","","","","","0):\$autoindex=0;foreach($\\1as\\2):\$autoindex++;?>","","","","","","");$body=preg_replace($patterns,$replacements,$body);file_put_contents($cache,"".$body);}}$view=newview();functionshow($tpl){global$view;return$view->load($tpl);}?>上面就是一个模版引擎了,看看如何使用php使用示例include'view.php';$title='文档标题';$a=array('a'=>'rows','b'=>array('c'=>'inarray'));includeshow('index');?>模版使用示例{title} 你好,仅供参考{a.a}{a.b.c}{foreacha:$v}{autoindex}.{v}{/foreach}{include:footer}
添加回答
举报
0/150
提交
取消