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 相关文章推荐
杏林同学录(六)
Oct 09 PHP
让你同时上传 1000 个文件 (二)
Oct 09 PHP
深入PHP数据缓存的使用说明
May 10 PHP
PHP判断图片格式的七种方法小结
Jun 03 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
PHP合并数组函数array_merge用法分析
Feb 17 PHP
Ubuntu 16.04下安装PHP 7过程详解
Mar 28 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 PHP
php模拟post提交请求调用接口示例解析
Aug 07 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项目打包方法
2008/02/18 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
2011/07/18 PHP
php轻松实现文件上传功能
2016/03/03 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
jQuery的强大选择器小结
2009/12/27 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
angularjs基础教程
2014/12/25 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
在Django框架中运行Python应用全攻略
2015/07/17 Python
Python实现模拟登录及表单提交的方法
2015/07/25 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
keras之权重初始化方式
2020/05/21 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
车辆年审委托书范本
2014/09/18 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
java多态注意项小结
2021/10/16 Java/Android
利用Apache Common将java对象池化的问题
2022/06/16 Servers