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 相关文章推荐
APMServ使用说明
Oct 23 PHP
如何使用PHP往windows中添加用户
Dec 06 PHP
PHP 引用是个坏习惯
Mar 12 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
May 07 PHP
php类常量的使用详解
Jun 08 PHP
使用php记录用户通过搜索引擎进网站的关键词
Feb 13 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
PHP中substr()与explode()函数用法分析
Nov 24 PHP
PHP也能干大事 随机函数
Apr 14 PHP
php显示页码分页类的封装
Jun 08 PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 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之require/include顺序 推荐
2011/01/02 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
一分钟理解js闭包
2016/05/04 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
从零学Python之入门(二)基本数据类型
2014/05/25 Python
Python读写Excel文件方法介绍
2014/11/22 Python
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
公司委托书格式范文
2014/10/09 职场文书
实习计划书范文
2015/01/16 职场文书
小学母亲节活动总结
2015/02/10 职场文书
财务个人年度总结范文
2015/02/26 职场文书
城管年度个人总结
2015/02/28 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis