陈力:传智播客古代 珍宝币 泡泡龙游戏开发第52讲:PHP仿smarty模板的实现

本文介绍了PHP仿Smarty模板的实现,旨在帮助贵阳网站建设人员理解模板处理机制。通过创建一个简单的模板引擎,将数据和界面显示分离,以提高代码的可维护性和团队协作效率。内容涉及模板技术的好处、自定义模板引擎的编写,以及正则表达式在模板替换中的应用。
摘要由CSDN通过智能技术生成

陈力:传智播客古代 珍宝币 泡泡龙游戏开发第52讲:PHP仿smarty模板的实现

描述: smarty模板技术为PHP程序设计中处理和界面的分离提供了很大的便利,有必要了解其设计思路和底层机制,本文设计了一个简单的仿Smarty模板,方便贵阳网站建设人员加深对smarty模板处理机制的了解。陈力:传智播客古代 珍宝币 泡泡龙游戏开发第52讲:PHP仿smarty模板的实现

一、smarty模板技术好处
    比如有要求如下:要显示标题和内容,可能需要从数据库中取值。
    在统计模式下,没有使用模板技术时,intro.php代码如下:
<?php
    $title=”我的文章标签”;
    $content=”我的文章内容”;
      //如果这个两个数据是从数据库,则需要建立数据库链接,更增加了贵阳网站建设人员对PHP的掌握难度。如果程序员是前台开发人员,让他去研究PHP编程,可能不是理想的结构吧。
   //mysql_connect ....
?>
<html>
<head><title><?php echo $title;></title></head>
<body>
<?php echo $content;?>//要有PHP程序设计代码完成显示功能。
</body>
</html>
    显示的问题虽然解决了,但存在一些问题:php脚本代码和界面(html/css/js)混合, 界面不简洁; 编写php页面要求贵阳网站建设程序员不但会php编程,同时还要会网页设计技术。不利于项目的分工协作开发。
    所以,通过模板技术来解决是很好的模式。模板引擎技术的核心思想就是:数据(通过php业务代码获取)和界面显示分离,同时理解这点也是我们透彻掌握smarty技术的关键, 现在我们用模板引擎技术来解决上面的问题。本文介绍怎样编写自己的模板引擎,透彻理解模板引擎技术。
    现在希望将显示部分“$title=”我的文章标签”;    $content=”我的文章内容”;”和数据分离。因此,把上面代码分成两个部分。一个是模板文件intro.tpl,另一个是:
intro.tpl源代码: 
<html>
<head><title>{%title}></title></head>
<body>
{%content}//通过占位符来识别。待用实际内容来填充。
</body>
</html>
    再设计一个为intro.tpl这个模板提供数据(占位符部分需要的数据)的控制器文件intro.php,这部分为真正的PHP文件,要使用模板技术来替换模板中占位符的内容。为其分配需要的数据。相当于前节(《一步一步跟我学PHP》第51讲:PHP中smarty模板技术介绍, http://www.by-sj.com/WebRes/Pro787.html)显示员工列表例子中的smarty部分,现在我们设计一个自己的模板来实现这个功能。在此取名为MyMiniSmarty.class.php。
    在Apache的htdocs目录(方便调试)中建一个目录Mysmarty。建文件intro.tpl,其内容如下面代码。
    再建一个intro.php待用,是处理界面请求的PHP文件。建一个MyMiniSmarty.class.php文件,是自定义的模板核心文件。程序运行时,系统自动用包括数据的代码替换模板中的占位符部分的代码。此时的代码才是真正可以运行的,之前的模板文件是不能直接解析的,所以具有一定的安全性。Smarty的工作就是将模板文件读入,处理成可以运行的文件再输出到编译的目录中,是服务器真正执行的文件。其代码如下:
<?PHP
    class MyMiniSmarty{
    //成员属性:定义三个:模板路径、编译路径,
    var $template_dir="./templates/";//模板文件路径,public和Var都表示公开,兼容性更好,低版本的也支持。
     var $complic_dir="./templates_c/";//模板文件被编译后的文件路径。
 //产生一个编译后的文件名称。放到templates_c目录中。
 $complie_file_path-$this->complic_dir."com_".$tpl_file.".php";
       Var $tpl_vars=array();//用于缓存数组的变量值。
      //定义方法
       Function assign($tpl_var,$val=null){
          If($tpl_var!=’’){
            $this->tpl_vars[$tpl_val]=$val;
}
}
//这里要编写display方法。调用时只需要一个模板文件。
Function display($tpl_file){
 //要读取模板文件内容并处理,把占位符替换成可以运行的代码,生成编译后文件。
   $tpl_file_path=$this->template_dir.$tpl_file;
   //判断文件是否存在。存在时候再读。
   If(!file_exists($tpl_file_path)){
  Return false;
}
   if (!file_exists($complie_file_path)||filemtime($tpl_file_path)>filemtime($complie_file_path)){
$fpl_file_con=file_get_contents($tpl_file_path);//读取文件内容
//下面要实现替换功能。需要有相关的正则表达式的知识。实习这些知识见下面的内容。
Echo “OK”;//$fpl_file_con;//显示出文件的原始内容
//测试本段代码是否正确执行。
//先在mysmarty目录中建一个templates目录,并把intro.tpl文件移动到此目录中。再建一个templates_c,用于存放编译后文件。
//在intro.php文件中增加代码如下:
//Require_once(“MyMiniSmarty.class.php”);
//$mysmarty=new myMinismarty();//实例化
//$mysmarty->assign(“title”,”我的第一个文件title”);
//$mysmarty->assign(“content”,”我的第一个文件内容”);
//$mysmarty->display(“intro.tpl”);
//运行intro.php即可显示”OK”;的内容,表示正常。下面就需要补一下正则表达式的内容咯。
//*************************************************
//****************************************************************
 //读取模板文件intro.tpl后,进行处理
 //下处理title后的空格等问题
 $pattern=array(
   '/\{\s*\$([a-zA-Z_][a-zA-Z0-9_]*)\s*\}/i'
  );
  //\{转意,表示{   \s表示批配任何空白字符,从语法严格性方法要放宽,所以要处理title前面空格和后面空格问题
  //([a-zA-Z_][a-zA-Z0-9_]*) 表示$符后的字符,可以以字母和下划线开头,后面的字符可以是字母或者数字或者下划线。可以有多个
  //替换成下面的串。要注意应用音引号,如果是双引号时表示里面的$要被执行。会出问题。
 $replace=array(
 '<?php echo $this->tpl_Vars["${1}"] ?>'
 );
 //${1}表示找到的第一个子表达式的内容,如找到1234则为:<?php echo $this->tpl["1234"]
 $newstr=preg_replace($pattern,$replace,$tpl_file_con);
 echo $newstr;
 //保存文件
 file_put_contents($complie_file_path,$newstr);
  //引入编译后的文件
}  //结束重复生成的判断
    include $complie_file_path;
//***************************************************8
}
 }
?>
文件执行后,正确显示:
<html>
<head><title>我的第一个文件title</title></head>
<body>
我的第一个文件内容</body>
</html>

    可以通过分配颜色等方式进行轻松修改。
    比如分配时可以:
    $mysmarty->assign("content","<font color=’red’>我的第一个文件内容</font>");
    到此,自定义的smarty模板设计完成,但在效率是要作文件生成处理,不可以有访问就重新生成文章。要进行模板修改时间和编译文件的修改时间的判断。
   if (!file_exists($complie_file_path)||filemtime($tpl_file_path)>filemtime($complie_file_path)){

}


二、正则表达式
    PHP中如何使用正则表达式。打开PHP手册,在函数中找到PCRE涵数,了解preg_replace函数。
preg_replace函数用于执行一个正则表达式的搜索和替换。格式:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
例子:
<?PHP
//怎样以PHP中使用正则表达式
$str="1234kfldsadf1;sakfd;9000lafkj;lsakf;lsa8900";
//要求把四个数替换成张三。
$pattern="/\d\d\d\d/i";//表示四个连续的数
$newstr=preg_replace($pattern,"张三",$str);
echo $newstr;//显示结果为:张三kfldsadf1;sakfd;张三lafkj;lsakf;lsa张三,表示替换成功。
?>
    此例子无法满足本例子的要求。
    例子2://要求是把四个数替换成<?php echo $this->tpl['1234']? >即替换后内容为:
//<?php echo $this->tpl['1234']? >kfldsadf1;sakfd;<?php echo $this->tpl['900']? >lafkj;lsakf;lsa<?php echo $this->tpl['8900']? >
在preg_replace中,pattern参数表示要搜索的模式. 可以使一个字符串或字符串数组。
    Replacement参数也可以是用于替换的字符串或字符串数组. 如果这个参数是一个字符串, 并且pattern 是一个数组, 那么所有的模式都使用这个字符串进行替换. 如果pattern和replacement 都是数组, 每个pattern使用replacement中对应的 元素进行替换. 如果replacement中的元素比pattern中的少, 多出来的pattern使用空字符串进行替换。
例子代码:
<?PHP
$str="1234kfldsadf1;sakfd;9000lafkj;lsakf;lsa8900";
//要求把四个数替换成张三。
$pattern=array(
  '/(\d\d\d\d)/i'
 );
$replace=array(
'<?php echo $this->tpl["${1}"] ?>'
);
//${1}表示找到的第一个子表达式的内容,如找到1234则为:<?php echo $this->tpl["1234"]
$newstr1=preg_replace($pattern,$replace,$str);
echo $newstr1;
?>
输出后的源代码为:
<?php echo $this->tpl["1234"] ?>kfldsadf1;sakfd;<?php echo $this->tpl["9000"] ?>lafkj;lsakf;lsa<?php echo $this->tpl["8900"] ?>
    下面要结合上例来进行替换。即要把如下intro.tpl模板代码进行替换:
<html>
<head><title>{%title}></title></head>
<body>
{%content}//通过占位符来识别。待用实际内容来填充。
</body>
</html>
针对这个文件来操作。
<?PHP
//读取模板文件intro.tpl
$tpl_file_con=file_get_contents("./templates/intro.tpl");
//下处理title后的空格等问题
$pattern=array(
  '/\{\s*\$([a-zA-Z_][a-zA-Z0-9_]*)\s*\}/i'
 );
 //\{转意,表示{   \s表示批配任何空白字符,从语法严格性方法要放宽,所以要处理title前面空格和后面空格问题
 //([a-zA-Z_][a-zA-Z0-9_]*) 表示$符后的字符,可以以字母和下划线开头,后面的字符可以是字母或者数字或者下划线。可以有多个
 //替换成下面的串。要注意应用音引号,如果是双引号时表示里面的$要被执行。会出问题。
$replace=array(
'<?php echo $this->tpl_Vars["${1}"] ?>'
);
//${1}表示找到的第一个子表达式的内容,如找到1234则为:<?php echo $this->tpl["1234"]
$newstr=preg_replace($pattern,$replace,$tpl_file_con);
echo $newstr;
//保存文件
file_put_contents("./templates_c/com_intro.tpl.php",$newstr);
echo "OK";
?>

【推荐阅读】陈力:传智播客古代 珍宝币 泡泡龙游戏开发第52讲:PHP仿smarty模板的实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值