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 正则表达式的学习探讨
Jun 06 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
php ajax异步读取rss文档数据
Mar 29 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
Apr 27 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 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中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
在python的类中动态添加属性与生成对象
2016/09/17 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
python3中for循环踩过的坑记录
2020/12/14 Python
HTML5 拖放(Drag 和 Drop)详解与实例代码
2017/09/14 HTML / CSS
广告学专业毕业生自荐信
2013/09/24 职场文书
中学生自我鉴定
2014/02/04 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
世界文化遗产导游词
2015/02/13 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
5个实用的JavaScript新特性
2022/06/16 Javascript