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 session应用实例 登录验证
Mar 16 PHP
小文件php+SQLite存储方案
Sep 04 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
Dec 25 PHP
解析:使用php mongodb扩展时 需要注意的事项
Jun 18 PHP
php session劫持和防范的方法
Nov 12 PHP
php获得url参数中具有&amp;的值的方法
Mar 05 PHP
php判断类是否存在函数class_exists用法分析
Nov 14 PHP
php获取json数据所有的节点路径
May 17 PHP
PHP 搜索查询功能实现
Nov 29 PHP
php文件上传类的分享
Jul 06 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP+redis实现微博的拉模型案例详解
Jul 10 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得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
PHP自动生成后台导航网址的最佳方法
2013/08/27 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
关于python字符串方法分类详解
2019/08/20 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
世界最大的票务市场:viagogo
2017/02/16 全球购物
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
上海期货面试题
2014/01/31 面试题
建筑专业毕业生推荐信
2013/11/21 职场文书
赡养老人协议书
2014/04/21 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
世界气象日活动总结
2015/02/27 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle