php模板函数 正则实现代码


Posted in PHP onOctober 15, 2012

我看过phpcms、discuz的源码,所以可能就缺乏创新了,不过原理大都相通,只是细节处理可能稍微不同。
说正题,下面开始谈谈具体实现过程了。
1.首先要想好模板文件放在哪?转换后的php文件放哪?还有怎么命名?直接上源码:

function template($tpl = 'index',$dir = 'hello') 
{ 
if(!file_exists($pd = TPL_PATH.$dir.'/'))@mkdir($pd,0777) or die("$pd目录创建失败");//如cache/tpl/hello/ 
if(!file_exists($td = TPL.$dir.'/'))@mkdir($td,0777) or die("$td目录创建失败");//如data/tpl/hello/ $t2p = $pd.$tpl.'.php';//模板文件正则转换后形成的php文件,如cache/tpl/hello/index.php 
$t2h = $td.$tpl.'.html';//html模板文件,如data/tpl/hello/index.html

2.什么时候需要正则转换?可以是正则后的php文件不存在,或正则前的html文件发生改变时。这里使用到了filemtime(string $path)函数,其返回文件最近修改时间。
if(!file_exists($t2p) || @filemtime($t2p) < @filemtime($t2h) )//模板文件改变后,正则的php文件相应更新 
{ 
template_go($t2p,$t2h);//模板转换开始 
} 
return $t2p;//返回正则后的php文件,可以这样调用:如include template('header','hello'); 
}

3.开始模板转换,先从html文件中读出,然后正则替换,最后写入php文件中。
function template_go($t2p,$t2h) 
{ 
$str = @file_get_contents($t2h);//读出 
if($str === false) exit("模板文件缺失,请检查!"); 
$str = template_do($str);//正则替换 
@chmod($t2p,0777); 
return $str = file_put_contents($t2p, $str);//写入 
}

4.正则规则,几条比较简略的正则替换语法。
function template_do($str) 
{ 
$str = preg_replace('/([\n\r+])\t+/s', '\\1', $str);//去掉TAB制表符。修正符/s是不忽略换行 
$str = preg_replace('/\{\$(.*)\}/Us', '<?php echo $\\1; ?>', $str);/*{$xx}换成<?php echo $xx;?> 注意,必须加上修正符/U,只能匹配一次。也可懒惰匹配*/ 
$str = preg_replace('/\{php (.+)\}/', '<?php \\1 ?>', $str);/*{php xxxx}换成<?php xxxx ?> 注意,不能加上修正符/s,要考虑多次进行该正则而换行的问题*/ 
$str = preg_replace('/\{template(.*)\}/Us', '<?php include template\\1; ?>', $str); 
/*{template(xx,yy)}换成<?php include template(xx,yy); ?> */ 
$str = preg_replace('/\{include (.*)\}/Us', '<?php include "\\1"; ?>', $str);/*{include xx.php}换成<?php include xx.php ?> */ 
$str = "<?php defined('IN_PH') or die('Access Denied');?>".$str; 
//$str = preg_replace('/\s+/', ' ', $str);//查看网页源代码看看 
return $str; 
}

当然,这个函数现在还是比较简陋的,期待能完善它。
ps:这算是我第一次写博客,原本是想着有空的话就写写技术博客,谈谈心得,当总结经验教训了,同时也是向大牛们学习。
还有就是,博客还是比较好保存的,方便省事,呵呵。
PHP 相关文章推荐
PHP 类商品秒杀计时实现代码
May 05 PHP
Views rows style模板重写代码
May 16 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
Aug 12 PHP
带密匙的php加密解密示例分享
Jan 29 PHP
php使用json_encode对变量json编码
Apr 07 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
php实现获取文件mime类型的方法
Feb 11 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
深入剖析浏览器退出之后php还会继续执行么
May 17 PHP
详解Yii2 rules 的验证规则
Dec 02 PHP
php mssql扩展SQL查询中文字段名解决方法
Oct 15 #PHP
PHP获取文件后缀名的三个函数
Oct 15 #PHP
php标签云的实现代码
Oct 10 #PHP
域名和cookie问题(域名后缀)
Oct 10 #PHP
记录PHP错误日志 display_errors与log_errors的区别
Oct 09 #PHP
php在程序中将网页生成word文档并提供下载的代码
Oct 09 #PHP
php排序算法(冒泡排序,快速排序)
Oct 09 #PHP
You might like
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
php实现paypal 授权登录
2015/05/28 PHP
PHP合并discuz用户脚本的方法
2015/08/04 PHP
javascript 对象的定义方法
2007/01/10 Javascript
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
JQUERY操作JSON实例代码
2010/02/09 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
Python的print用法示例
2014/02/11 Python
python学习数据结构实例代码
2015/05/11 Python
Python3处理文件中每个词的方法
2015/05/22 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
python微信公众号开发简单流程
2018/03/23 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
python set集合使用方法解析
2019/11/05 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
普天C++笔试题
2016/03/20 面试题
优秀教师先进事迹
2014/01/22 职场文书
个人作风剖析材料
2014/02/02 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
2014年医院工作总结
2014/11/20 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
Redis分布式锁的7种实现
2022/04/01 Redis