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实现mysql同步的实现方法
Oct 21 PHP
PHP 创建标签云函数代码
May 26 PHP
用PHP书写安全的脚本代码
Feb 05 PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 PHP
CI框架装载器Loader.php源码分析
Nov 04 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 PHP
微信支付开发告警通知实例
Jul 12 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
Feb 05 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
php实现二叉树中和为某一值的路径方法
Oct 14 PHP
PHP isset empty函数相关面试题及解析
Dec 11 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
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
为你总结一些php信息函数
2015/10/21 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
使用JS动态显示文本
2017/09/09 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
python使用socket远程连接错误处理方法
2015/04/29 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python模拟百度登录实例详解
2016/01/20 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
python实现维吉尼亚加密法
2019/03/20 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
python实现扫雷小游戏
2020/04/24 Python
2014升学宴答谢词
2014/01/26 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
个人汇报材料范文
2014/12/30 职场文书
工作年限证明范本
2015/06/15 职场文书
分享一些Java的常用工具
2021/06/11 Java/Android
java设计模式--建造者模式详解
2021/07/21 Java/Android