PHP 模板引擎

<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/1/11 0011
* Time: 下午 4:25
*/

//封装模板引擎函数 display()
//两个参数:参数1:显示数据的HTML文件 参数2:需要在HTML中显示的数据,(要显示的数据)
function display($tplName,$data = null)//要显示的数据也可以为空
{
//拼接HTML的全路径
$filePath = rtrim(TPL_VIEW,'/').'/'.$tplName;

//判断该文件是否存在
if (!file_exists($filePath)){
exit('改模板文件不存在');
}
//判断缓存文件进行判断 checkDir是封装的函数 要封装一个函数来对权限进行判断
if (!checkDir(TPL_CACHE)){
exit('没有权限');
}

//1、读取HTML里面的内容 函数 file_get_content();
$content = file_get_contents($filePath);

//2、将内容中的模板引擎语法:{} 替换成PHP的语法:<?php
$php = compile($content);//compile替换需要再封装一个函数

/*3、将替换好的内容以.php的形式保存
*拼接替换好的php名字
* */
$name = str_replace('.','_',$tplName).'.php';

//拼接缓存文件的全路径
$cachePath = rtrim(TPL_CACHE,'/').'/'.$name;

//通过file_put_content()函数将替换好的内容以.php的形式保存
file_put_contents($cachePath,$php);

//4、包含生成的PHP文件
if ($data){
//通过extract函数将被转换的数组转换为变量
extract($data);
include $cachePath;
}
}

//封装compile函数, 用来将内容中的模板引擎语法:{} 替换成PHP的语法:<?php
function compile($content)
{
//在test.php文件中,因为已将变量用compact函数变成了一个数组的形式,所以通过数组的键对值形式来封装它的语法格式
$array = [
//$%% 是一个占位符,表示的就是变量名,//
//$\1这个里面的\1就是变量名,表示正则表达式里面的第一个子模式,也就是第一个()里面匹配的内容
'{$%%}' =>'<?php echo $\1;?>',
'{if %%}'=>'<?php if (\1):?>',
'{/if}'=>'<?php endif;?>',
'{else}'=>'<?php else:?>',
'{foreach %%}'=>'<?php foreach (\1):?>',
'{/foreach}'=>'<?php endforeach;?>',
'{while %%}' => '<?php while(\1):?>',
'{/while}' => '<?php endwhile;?>',
'{for %%}' => '<?php for(\1):?>',
'{/for}' => '<?php endfor;?>',
'{continue}' => '<?php continue;?>',
'{switch %%}' => '<?php switch (\1): ?>',
'{case %%}' => '<?php case \1: ?>',
'{break}' => '<?php break; ?>',
'{/switch}' => '<?php endswitch; ?>',
'{$%%++}' => '<?php $\1++;?>',
'{$%%--}' => '<?php $\1--;?>',
'{/*}' => '<?php /*',
'{*/}' => '*/?>',
'{section}' => '<?php ',
'{/section}' => '?>',
'{$%% = $%%}' => '<?php $\1 = $\2;?>',
'{default}' => '<?php default:?>',
'{include %%}' => '这的代码就是来捣乱的',
];
//通过foreach遍历的方法来写正则表达式
foreach ($array as $key => $value){
//定义一个正则表达式
//通过str_replace函数来将%%替换为正则,然后在定界符上,通过preg_quote函数将#号(会转义)和定界符区分
$pattern = '#'.str_replace('%%','(.*?)',preg_quote($key,'#')).'#';

//考虑包含了include的正则时的情况,首先是判断出是否含有include
if (strstr($key,'include')){
//含有include的情况,通过函数回调$content里得到的参数,然后需要在封装一个函数来处理include的情况
$content = preg_replace_callback($pattern,'myInclude',$content);
}else {
//搜索$content中匹配$pattern的部分, 以$value进行替换。(没有include的情况)
$content = preg_replace($pattern,$value,$content);
}
}
return $content;
}

//封装checkDir()函数, 对文件夹的读写操作权限进行判断
function checkDir($dirPath)
{
//首先需要去判断一下有没有该文件夹的存在,不管有或者没有都返回一个创建的文件夹
if (!file_exists($dirPath)){
//mkdir(参数1:目录,参数2:访问的权限,一般默认是0777,是最大的权限,参数3:....)
return mkdir($dirPath,'0755','true');
}
//然后是对文件夹的读写权限操作(用到两个参数:is_readable-是否可读,is_writeable-是否可写入)
if (!is_readable($dirPath) || !is_writeable($dirPath)){
//chmod():改变文件的权限 两个参数:参数1:文件的路径 参数2:权限,一般默认是0777,是最大的权限
return chmod($dirPath,'0755');
}
return true;
}


//封装处理含有include时的函数 myInclude
function myInclude($data)
{
//去掉include两边的单双引号
$name = trim($data[1],'\'"');
//得到被包含的html文件的缓存文件,但是并没有include进来,若想要包含,需要自己去include
display($name);
//拼接缓存文件的全路径
$newname = rtrim(TPL_CACHE,'/').'/'.str_replace('.','_',$name).'.php';

return "<?php include '$newname';?>";
}




























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值