php 超实用的模板引擎
超实用的模板引擎 [代码片段(175行)]
方法:
$this->assign('style',$style);//变量
$this->display();//模板
<?php
/*配制*/
$config=array(
/* 数据库设置 */
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'php', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '123', // 密码
'DB_PREFIX' => 'jiaodu_', // 数据库表前缀
'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8
/* SESSION设置 */
'SESSION_START' => 'user', //session方式,文件方式:file, 数据库设置为user
/* 模板引擎设置 */
'TMPL_ADMIN_PATH' =>'admin',//后台目录名称
'TMPL_COMPILE_PATH' =>'/Runtime',//读写目录
'TMPL_PATH' =>'/template',//模板路径
'TMPL_TEMPLATE_SUFFIX' => 'html', // 默认模板文件后缀
'TMPL_L_DELIM' => '{', // 模板引擎普通标签开始标记
'TMPL_R_DELIM' => '}', // 模板引擎普通标签结束标记
'TMPL_STRIP_SPACE' => true, // 是否去除模板文件里面的html空格与换行
'TMPL_CACHE_ON' => true, // 是否开启模板编译缓存,设为false则每次都会重新编译,一般用于模板调试
/* URL设置 */
'URL_HTML_SUFFIX' => 'html', // URL伪静态后缀设置
'URL_PATHINFO_MODEL' => 2, // URL模式,1不隐藏、2隐藏入口文件[需要规则支持]
/*其它设置*/
'PASS_ENCRYPT' =>'outofmemory.cn
);
<?php
/**
* 模板解析类
*
*/
class template extends Action{
private $config;
private $CompileDir;//编译目录
private $templateDir;//模板目录
private $templateFile;
private $debuy=1;//是否调试
private $assign;//变量
public function __construct($templateFile){
$this->config();
$this->templateFile=$templateFile;
}
private function config(){
global $config;
$this->config=$config;
$this->CompileDir=$this->config['TMPL_COMPILE_PATH'].'/Compile';
$this->templateDir=$this->config['TMPL_PATH'];
$this->debuy=$this->config['TMPL_CACHE_ON'];
}
/**
* 检查编译目录
*/
public function is_CompileDir(){
$dir=APP_PATH.$this->CompileDir;
if (!is_dir($dir)){
if (!mkdir($dir)){
die('编译目录自动创建失败,请手动创建');
}
}
if (!is_writeable($dir)){
die('编译目录没有写入权');
}
}
/**
* 注入变量
*/
public function assign($assign) {
$this->assign=$assign;
}
/**
* 输出模板
*/
public function display(){
$this->is_CompileDir();
$this->CompileCheck();
}
/**
* 检查编译
*/
private function CompileCheck(){
$this->is_CompileDir();
$filename=APP_PATH.$this->CompileDir.'/'.md5($this->templateFile).'.php';
if ($this->debuy || !is_file($filename)){
$this->tmplstrtpspace($filename);
}
foreach ($this->assign as $key=>$row){
$$key=$row;
}
include $filename;
}
/**
* 格式化模板并写入编译
*/
private function tmplstrtpspace($filename){
if ($this->config['TMPL_STRIP_SPACE']){
$find = array("~>\\\\s+<~","~>(\\\\s+\\\\n|\\\\r)~");
$replace = array("><",">");
$tmplContent = preg_replace($find, $replace,$this->templateCheck());
}else {
$tmplContent = $this->templateCheck();
}
if (file_put_contents($filename,trim($tmplContent))){
return true;
}else {
die('编译写入失败');
}
}
/**
* 检查模板
*/
private function templateCheck(){
$PATH=APP_PATH.$this->templateDir.'/'.$this->templateFile.'.html';
if (is_file($PATH)){
return $this->template_compile(file_get_contents ( $PATH ));
}else {
die('模板:'.$this->templateFile.'.html 不存在');
}
}
/**
* 编译模板
*/
private function template_compile($template_Conver){
if (empty($template_Conver)){
return $template_Conver;
}else {
$_Left= $this->config['TMPL_L_DELIM'];
$_Right= $this->config['TMPL_R_DELIM'];
$template_Preg [] = '/<\\\\?(=|php|)(.+?)\\\\?>/is';
$template_Preg [] = '/' . $_Left . '(else if|elseif) (.*?)' . $_Right . '/i';
$template_Preg [] = '/' . $_Left . 'for (.*?)' . $_Right . '/i';
$template_Preg [] = '/' . $_Left . 'while (.*?)' . $_Right . '/i';
$template_Preg [] = '/' . $_Left . '(loop|foreach) (.*?)' . $_Right . '/i';
$template_Preg [] = '/' . $_Left . 'if (.*?)' . $_Right . '/i';
$template_Preg [] = '/' . $_Left . 'else' . $_Right . '/i';
$template_Preg [] = '/' . $_Left . "(eval|_)( |[\\\\r\\\\n])(.*?)" . $_Right . '/is';
$template_Preg [] = '/' . $_Left . '_e (.*?)' . $_Right . '/is';
$template_Preg [] = '/' . $_Left . '_p (.*?)' . $_Right . '/i';
$template_Preg [] = '/' . $_Left . '\\\\/(if|for|loop|foreach|eval|while)' . $_Right . '/i';
$template_Preg [] = '/' . $_Left . '((( *(\\\\+\\\\+|--) *)*?(([_a-zA-Z][\\\\w]*\\\\(.*?\\\\))|\\\\$((\\\\w+)((\\\\[|\\\\()(\\\\'|")?\\\\$*\\\\w*(\\\\'|")?(\\\\)|\\\\]))*((->)?\\\\$?(\\\\w*)(\\\\((\\\\'|")?(.*?)(\\\\'|")?\\\\)|))){0,})( *\\\\.?[^ \\\\.]*? *)*?){1,})' . $_Right . '/i';
$template_Preg [] = "/( | ){0,}(\\\\r\\\\n){1,}\\\\";/";
$template_Preg [] = '/' . $_Left . '(\\\\#|\\\\*)(.*?)(\\\\#|\\\\*)' . $_Right . '/';
$template_Preg [] = '/' . $_Left . '\\\\%([a-zA-Z_\\\\x7f-\\\\xff][a-zA-Z0-9_\\\\x7f-\\\\xff]*)' . $_Right . '/';
$template_Replace [] = '<?\\\\\\\\1\\\\\\\\2?>';
$template_Replace [] = '<?php }else if (\\\\\\\\2){ ?>';
$template_Replace [] = '<?php for (\\\\\\\\1) { ?>';
$template_Replace [] = '<?php while (\\\\\\\\1) { ?>';
$template_Replace [] = '<?php foreach ((array)\\\\\\\\2) { $__i++; ?>';
$template_Replace [] = '<?php if (\\\\\\\\1){ ?>';
$template_Replace [] = '<?php }else{ ?>';
$template_Replace [] = '<?php \\\\\\\\3; ?>';
$template_Replace [] = '<?php echo \\\\\\\\1; ?>';
$template_Replace [] = '<?php print_r(\\\\\\\\1); ?>';
$template_Replace [] = '<?php } ?>';
$template_Replace [] = '<?php echo \\\\\\\\1;?>';
$template_Replace [] = '';
$template_Replace [] = '';
$template_Replace [] = '<?php echo $this->lang_array[\\\\'\\\\\\\\1\\\\'];?>';
return preg_replace ( $template_Preg, $template_Replace, $template_Conver );
}
}
}
//该片段来自于http://outofmemory.cn
精彩图集
精彩文章






