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基础知识:控制结构
Dec 13 PHP
随时给自己贴的图片加文字的php代码
Mar 08 PHP
php Try Catch异常测试
Mar 01 PHP
Godaddy空间Zend Optimizer升级方法
May 10 PHP
帝国cms目录结构分享
Jul 06 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
php根据用户名和手机号查询是否存在手机号码
Feb 16 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
PHP快速排序算法实现的原理及代码详解
Apr 03 PHP
php pdo连接数据库操作示例
Nov 18 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
动态生成gif格式的图像要注意?
2006/10/09 PHP
PHP 反射机制实现动态代理的代码
2008/10/22 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
javascript算法学习(直接插入排序)
2011/04/12 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
《javascript少儿编程》location术语总结
2018/05/27 Javascript
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
Vue项目History模式404问题解决方法
2018/10/31 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
Python中内建函数的简单用法说明
2016/05/05 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
django2 快速安装指南分享
2018/01/05 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
python爬虫实现获取下一页代码
2020/03/13 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
电子商务系毕业生自荐信
2014/05/29 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript