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 相关文章推荐
smarty实例教程
Nov 19 PHP
实例(Smarty+FCKeditor新闻系统)
Jan 02 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
Jun 13 PHP
php配置php-fpm启动参数及配置详解
Nov 04 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
Jun 23 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
php实现可逆加密的方法
Aug 11 PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
Oct 16 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 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
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
php提取微信账单的有效信息
2018/10/01 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
Js 随机数产生6位数字
2010/05/13 Javascript
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
获取body标签的两种方法
2011/10/13 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
laypage.js分页插件使用方法详解
2019/07/27 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
让python 3支持mysqldb的解决方法
2017/02/14 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
python验证身份证信息实例代码
2019/05/06 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python虚拟环境完美部署教程
2019/08/06 Python
python模块导入的方法
2019/10/24 Python
原生python实现knn分类算法
2019/10/24 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
服务质量承诺书
2014/03/27 职场文书
小班评语大全
2014/05/04 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript