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字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
Nov 10 PHP
超级实用的7个PHP代码片段分享
Jan 05 PHP
跟我学Laravel之配置Laravel
Oct 15 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
Linux安装配置php环境的方法
Jan 14 PHP
php中array_column函数简单实现方法
Jul 11 PHP
php写app接口并返回json数据的实例(分享)
May 20 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 23 PHP
PHP控制循环操作的时间
Apr 01 PHP
PHP实现rar解压读取扩展包小结
Jun 03 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 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
python算法学习之基数排序实例
2013/12/18 Python
python任务调度实例分析
2015/05/19 Python
详解Python爬虫的基本写法
2016/01/08 Python
Python单向链表和双向链表原理与用法实例详解
2018/08/31 Python
python字典的遍历3种方法详解
2019/08/10 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
Python request使用方法及问题总结
2020/04/26 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
英语教师自荐信
2014/05/26 职场文书
学生会个人总结范文
2015/02/15 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
小学英语听课心得体会
2016/01/14 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
详解nginx进程锁的实现
2021/06/14 Servers