龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php 超实用的模板引擎

时间:2014-11-19 02:40来源:网络整理 作者:网络 点击:
分享到:
超实用的模板引擎 [代码片段(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
精彩图集

赞助商链接