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
在PHP3中实现SESSION的功能(三)
Oct 09 PHP
PHP_MySQL教程-第一天
Mar 18 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
php抽象类用法实例分析
Jul 07 PHP
php图像处理类实例
Jul 28 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
php HTML无刷新提交表单
Apr 05 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 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图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
分享一个asp.net pager分页控件
2012/01/04 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
vue 集成jTopo 处理方法
2019/08/07 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
一篇文章快速了解Python的GIL
2018/01/12 Python
Python切片索引用法示例
2018/05/15 Python
python中web框架的自定义创建
2019/09/08 Python
Python实现元素等待代码实例
2019/11/11 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
简单了解python元组tuple相关原理
2019/12/02 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
Crabtree & Evelyn英国官网:瑰珀翠护手霜、香水、沐浴和身体护理
2018/04/26 全球购物
党支部书记先进事迹
2014/01/17 职场文书
小学语文教学反思
2014/02/10 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
世界文化遗产导游词
2019/08/07 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python