从康盛产品(discuz)提取出来的模板类
2015-01-24信息快讯网
从康盛产品(discuz)提取出来的模板类,学习php的朋友可以参考下。
<?php /*template.class.php @康盛微博 模板提取类 觉得这个模板好用 花些时间独立出来。 by 雷日锦 @看了一下ctt 这个模板 跟 phpcms的模板类似 难道?? ^_^ 嘿嘿!!! @ 微博 http://weibo.com/lrjxgl @ 好东西大家共享 磕磕绊绊的提取出来 有问题请提出来 @ 模板文件默认为 .htm $tpl = new template('skin',"default"); $tpl->objdir='tpp'; $tpl->rewrite=true;//开启rewrite 需要服务器支持 $tpl->rewrite_rule=array(array("/index\.php/"),array("index.html")); //rewrite规则 $tpl->assign("indexurl","index.php"); $tpl->assign("str","我是字符串啦啦啦"); $tpl->assign("ec","我是被echo出来的"); $tpl->assign("subhtml","{subtpl ttt}这是用来引入一个模板文件的,这个就是引入ttt.htm"); $tpl->assign("a",array('dasdasd'.'bbbbbbb','cccccccccccccc')); $tpl->assign("i",1); $tpl->display("index"); */ if(!defined("CHARSET")) define("CHARSET","gb2312");//字符编码 if(!defined("DIR_TPL")) define("DIR_TPL","tpl");//默认模板目录 if(!defined("DIR_DATA")) define("DIR_DATA","data");//默认数据目录 if(!defined("DEBUG")) define("DEBUG",0);//默认运行模式 class template { //note var public $rewrite=false;//是否开启 伪静态 rewrite public $rewrite_rule=array(); //设置伪静态规则 public $defaulttpldir;//默认的模板 public $tpldir;//模板目录 public $objdir;//编译缓存目录 public $tplfile;//模板文件 public $objfile;//编译文件 public $tplid=1;//模板编号 public $currdir='default';//当前风格目录 public $vars=array();//note 变量表 public $removeblanks=false;//移除空格 public $stdout='display';//输出类型 function __construct($tplid, $currdir) { $this->template($tplid, $currdir); } function template($tplid, $currdir) { ob_start(); if(file_exists(DIR_TPL.'/'.$currdir)) { $this->currdir = $currdir; $this->tplid = $tplid; } else { $this->currdir = 'default'; $this->tplid = 1; } $this->defaulttpldir = DIR_TPL.'/default'; $this->tpldir = DIR_TPL.'/'.$this->currdir; $this->objdir = DIR_DATA.'/cache/tpl'; if(version_compare(PHP_VERSION, '5') == -1) { register_shutdown_function(array(&$this, '__destruct')); } } //note publlic function assign($k, $v) { $this->vars[$k] = $v; } //note publlic function display($file) { extract($this->vars, EXTR_SKIP); include $this->getObj($file); } function getObj($file, $tpldir = '') { $subdir = ($pos = strpos($file, '/')) === false ? '' : substr($file, 0, $pos); $file = $subdir ? substr($file, $pos + 1) : $file; $this->tplfile = ($tpldir ? $tpldir : $this->tpldir).'/'.($subdir ? $subdir.'/' : '').$file.'.htm'; $this->objfile = $this->objdir.'/'.($tpldir ? '' : $this->tplid.'_').($subdir ? $subdir.'_' : '').$file.'.php'; //note 默认目录 if(@filemtime($this->tplfile) === FALSE) { $this->tplfile = $this->defaulttpldir.'/'.($subdir ? $subdir.'/' : '').$file.'.htm'; } //note 判断是否比较过期 if(!file_exists($this->objfile) || DEBUG && @filemtime($this->objfile) < filemtime($this->tplfile)) { $this->compile(); } return $this->objfile; } function getTpl($file) { $subdir = ($pos = strpos($file, '/')) === false ? '' : substr($file, 0, $pos); $file = $subdir ? substr($file, $pos + 1) : $file; $tplfile = $this->tpldir.'/'.($subdir ? $subdir.'/' : '').$file.'.htm'; if(@filemtime($tplfile) === FALSE) { $tplfile = $this->defaulttpldir.'/'.($subdir ? $subdir.'/' : '').$file.'.htm'; } return $tplfile; } function compile() { $var_regexp = "\@?\\\$[a-zA-Z_]\w*(?:\[[\w\.\"\'\[\]\$]+\])*"; $vtag_regexp = "\<\?=(\@?\\\$[a-zA-Z_]\w*(?:\[[\w\.\"\'\[\]\$]+\])*)\?\>"; $const_regexp = "\{([\w]+)\}"; $template = file_get_contents($this->tplfile); for($i = 1; $i <= 3; $i++) { if(strpos($template, '{subtpl') !== FALSE) { if(DEBUG == 2) { $template = str_replace('{subtpl ', '{tpl ', $template); } else { $template = preg_replace("/[\n\r\t]*\{subtpl\s+([a-z0-9_:\/]+)\}[\n\r\t]*/ies", "file_get_contents(\$this->getTpl('\\1'))", $template); } } } $remove = array( '/(^|\r|\n)\/\*.+?(\r|\n)\*\/(\r|\n)/is', '/\/\/note.+?(\r|\n)/i', '/\/\/debug.+?(\r|\n)/i', '/(^|\r|\n)(\s|\t)+/', '/(\r|\n)/', ); $this->removeblanks && $template = preg_replace($remove, '', $template); $template = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}", $template); $template = preg_replace("/\{($var_regexp)\}/", "<?=\\1?>", $template); $template = preg_replace("/\{($const_regexp)\}/", "<?=\\1?>", $template); $template = preg_replace("/(?<!\<\?\=|\\\\)$var_regexp/", "<?=\\0?>", $template); $template = preg_replace("/\<\?=(\@?\\\$[a-zA-Z_]\w*)((\[[\\$\[\]\w]+\])+)\?\>/ies", "\$this->arrayindex('\\1', '\\2')", $template); $template = preg_replace("/\{\{eval (.*?)\}\}/ies", "\$this->stripvtag('<? \\1?>')", $template); $template = preg_replace("/\{eval (.*?)\}/ies", "\$this->stripvtag('<? \\1?>')", $template); $template = preg_replace("/[\n\r\t]*\{echo\s+(.+?)\}[\n\r\t]*/ies", "\$this->stripvtag('<? echo \\1; ?>','')", $template); $template = preg_replace("/\{for (.*?)\}/ies", "\$this->stripvtag('<? for(\\1) {?>')", $template); $template = preg_replace("/\{elseif\s+(.+?)\}/ies", "\$this->stripvtag('<? } elseif(\\1) { ?>')", $template); for($i=0; $i<2; $i++) { $template = preg_replace("/\{loop\s+$vtag_regexp\s+$vtag_regexp\s+$vtag_regexp\}(.+?)\{\/loop\}/ies", "\$this->loopsection('\\1', '\\2', '\\3', '\\4')", $template); $template = preg_replace("/\{loop\s+$vtag_regexp\s+$vtag_regexp\}(.+?)\{\/loop\}/ies", "\$this->loopsection('\\1', '', '\\2', '\\3')", $template); } $template = preg_replace("/\{if\s+(.+?)\}/ies", "\$this->stripvtag('<? if(\\1) { ?>')", $template); $template = preg_replace("/\{tpl\s+(\w+?)\}/is", "<? include \$this->getObj(\"\\1\");?>", $template); $template = preg_replace("/\{tpl\s+(.+?)\}/ise", "\$this->stripvtag('<? include \$this->getObj(\"\\1\"); ?>')", $template); $template = preg_replace("/\{tmptpl\s+(\w+?)\}/is", "<? include \$this->getObj(\"\\1\", \$this->objdir);?>", $template); $template = preg_replace("/\{tmptpl\s+(.+?)\}/ise", "\$this->stripvtag('<? include \$this->getObj(\"\\1\", \$this->objdir); ?>')", $template); $template = preg_replace("/\{else\}/is", "<? } else { ?>", $template); $template = preg_replace("/\{\/if\}/is", "<? } ?>", $template); $template = preg_replace("/\{\/for\}/is", "<? } ?>", $template); $template = preg_replace("/$const_regexp/", "<?=\\1?>", $template);//note {else} 也符合常量格式,此处要注意先后顺序 $template = preg_replace("/(\\\$[a-zA-Z_]\w+\[)([a-zA-Z_]\w+)\]/i", "\\1'\\2']", $template); $fp = fopen($this->objfile, 'w'); fwrite($fp, $template); fclose($fp); } function arrayindex($name, $items) { $items = preg_replace("/\[([a-zA-Z_]\w*)\]/is", "['\\1']", $items); return "<?=$name$items?>"; } function stripvtag($s) { $vtag_regexp = "\<\?=(\@?\\\$[a-zA-Z_]\w*(?:\[[\w\.\"\'\[\]\$]+\])*)\?\>"; return preg_replace("/$vtag_regexp/is", "\\1", str_replace("\\\"", '"', $s)); } function loopsection($arr, $k, $v, $statement) { $arr = $this->stripvtag($arr); $k = $this->stripvtag($k); $v = $this->stripvtag($v); $statement = str_replace("\\\"", '"', $statement); return $k ? "<? foreach((array)$arr as $k => $v) {?>$statement<?}?>" : "<? foreach((array)$arr as $v) {?>$statement<? } ?>"; } function __destruct() { $content = ob_get_contents(); //处理 rewrite if($this->rewrite) { $arr=$this->rewrite_rule; $s=$arr[0]; $e=$arr[1]; $content=preg_replace($s,$e,$content); } ob_end_clean(); echo $content; } } $tpl = new template('skin',"default"); $tpl->objdir='tpp'; $tpl->rewrite=true;//开启rewrite 需要服务器支持 $tpl->rewrite_rule=array(array("/index\.php/"),array("index.html")); //rewrite规则 $tpl->assign("indexurl","index.php"); $tpl->assign("str","我是字符串啦啦啦"); $tpl->assign("ec","我是被echo出来的"); $tpl->assign("subhtml","{subtpl ttt}这是用来引入一个模板文件的,这个就是引入ttt.htm"); $tpl->assign("a",array('dasdasd'.'bbbbbbb','cccccccccccccc')); $tpl->assign("i",1); $tpl->display("index"); ?>
新建 tpl/default/index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> 1.字符串赋值 :<br /> {$str} <br /> 2.数组赋值 :<br /> {loop $a $v}{$v},{/loop} 或者<br /> {loop $a $key $val }{$val},{/loop} 3.{$subhtml}<br /> {subtpl ttt}<br /> 4.原来我是{$indexurl } 现在我被变成了index.php<br /> 5.我还可以 echo 出来呢<br /> {echo $ec}<br /> 6.其实我还可以加减乘除的 6*7*8 {echo 6*7*8;} 7.常用的就这些了 还有什么不懂的 <br /> </body> </html>
新建 tpl/default/ttt.html
新建 tpp目录 ok了
php中unlink()、mkdir()、rmdir()等方法的使用介绍
thinkphp3.0 模板中函数的使用
thinkPHP的Html模板标签使用方法
php curl 伪造IP来源的实例代码
PHP学习笔记 IIS7下安装配置php环境
Zend Studio去除编辑器的语法警告设置方法
php模板函数 正则实现代码
记录PHP错误日志 display_errors与log_errors的区别
PHP中数字检测is_numeric与ctype_digit的区别介绍
Thinkphp模板中使用自定义函数的方法
php中inlcude()性能对比详解
php中判断文件存在是用file_exists还是is_file的整理
PHP中file_exists与is_file,is_dir的区别介绍
PHP curl 并发最佳实践代码分享
比较discuz和ecshop的截取字符串函数php版
php中通过curl smtp发送邮件
PHP原生模板引擎 最简单的模板引擎
php中比较简单的导入phpmyadmin生成的sql文件的方法
php skymvc 一款轻量、简单的php
php dirname(__FILE__) 获取当前文件的绝对路径
php设计模式 Template (模板模式)
php设计模式 Mediator (中介者模式)
php whois查询API制作方法
PHP读取网页文件内容的实现代码(fopen,curl等)
php中使用Akismet防止垃圾评论的代码
php下通过curl抓取yahoo boss 搜索结果的实现代码
php在页面中调用fckeditor编辑器的方法
IIS7.X配置PHP运行环境小结
PHP 获取远程网页内容的代码(fopen,curl已测)
关于php curl获取301或302转向的网址问题的解决方法
基于PHP的cURL快速入门教程 (小偷采集程序)
使ecshop模板中可引用常量的实现方法
php自动获取字符串编码函数mb_detect_encoding
php的list()的一步操作给一组变量进行赋值的使用
Views rows style模板重写代码
rrmdir php中递归删除目录及目录下的文件
php中神奇的fastcgi_finish_request
在smarty模板中使用PHP函数的方法
PHP中MVC模式的模板引擎开发经验分享