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实现登陆验证码(类似条行码状)
Oct 09 PHP
关于PHP中的Class的几点个人看法
Oct 09 PHP
PHP $_SERVER详解
Jan 16 PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
PHP获取当前日期和时间及格式化方法参数
May 11 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
php经典算法集锦
Nov 14 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
简单介绍PHP非阻塞模式
Mar 03 PHP
PHP实现简易blog的制作
Oct 24 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 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
德生9700DX电路分析
2021/03/02 无线电
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
JavaScript的面向对象方法以及差别
2008/03/31 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
Python 自动补全(vim)
2014/11/30 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
农民工工资发放承诺书
2014/03/31 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
2016年教师新年寄语
2015/08/18 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android