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 相关文章推荐
php5 pdo新改动加载注意事项
Sep 11 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
Sep 09 PHP
基于php-fpm的配置详解
Jun 03 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
PHP中__FILE__、dirname与basename用法实例分析
Dec 01 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
高质量PHP代码的50个实用技巧必备(下)
Jan 22 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
Mar 21 PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
Aug 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中OO之静态关键字以及类常量的详解
2013/06/07 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
php中动态修改ini配置
2014/10/14 PHP
php网页病毒清除类
2014/12/08 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
动态控制Table的js代码
2007/03/07 Javascript
javascript StringBuilder类实现
2008/12/22 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
基于windows下pip安装python模块时报错总结
2018/06/12 Python
python如何生成各种随机分布图
2018/08/27 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
Pycharm github配置实现过程图解
2020/10/13 Python
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
秋季运动会开幕词
2015/01/28 职场文书
2015年安全月活动总结
2015/03/26 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS