PHP的正则表达式今天就结束了,遥想几年前初次接触的时候,感觉这玩意真心玩不转啊,而时至今日,感觉这也没有什么难以理解的,确实还是有很大进步的,尤其是对smarty模板引擎有了一个更为清晰的认识。正则表达式学到最后,总是会抛出这个编写一个山寨的smarty模板引擎的话题出来练练手,今天就在大师的指导下,编写了这么一个山寨smarty,作为这次复习正则的一个句点吧。

class template{

//存储模板引擎源文件目录

private $templateDir;

//编译后的文件目录

private $compileDir;

//边界符号左边界

private $leftTag="{#";

//边界符号右边界

private $rightTag="#}";

//当前正在编译的模板文件名

private $currentTemp='';

//当前源文件中的html代码

private $outputHtml;

//变量池

private $varPool=array();

//构造函数 传入模板文件目录  编译文件目录

public function __construct($templateDir,$compileDir,$leftTag=null,$rightTag=null){

$this->templateDir=$templateDir;

$this->compileDir=$compileDir;

if(!empty($leftTag))$this->leftTag=$leftTag;

if(!empty($rightTag))$this->rightTag=$rightTag;

}

//往变量池中写入数据

public function assign($tag,$var){

$this->varPool[$tag]=$var;

}

//从变量池中取出数据的方法

public function getVar($tag){

return $this->varPool[$tag];

}

//获得源文件内容

public function getSourceTemplate($templateName,$ext='.html'){

$this->currentTemp=$templateName;

//拿到完整路径

$sourceFilename=$this->templateDir.$templateName.$ext;

//获得源文件中的html代码

$this->outputHtml=file_get_contents($sourceFilename);

}

//创建编译文件

public function compileTemplate($templateName=null,$ext='.html'){

$templateName=empty($templateName)?$this->currentTemp:$templateName;

//开始正则匹配

$pattern='/'.preg_quote($this->leftTag);

$pattern.=' *\$([a-zA-Z]\w*) *';

$pattern.=preg_quote($this->rightTag).'/';

$this->outputHtml=preg_replace($pattern, '<?php  echo $this->getVar(\'$1\') ?>', $this->outputHtml);

//编译文件完整路径

$compileFilename=$this->compileDir.md5($templateName).$ext;

file_put_contents($compileFilename, $this->outputHtml);

}

//模板输出

public function display($templateName=null,$ext='.html'){

$templateName=empty($templateName)?$this->currentTemp:$templateName;

include_once $this->compileDir.md5($templateName).$ext;

}

}

$baseDir=str_replace('\\', '/', dirname(__FILE__));

$temp=new template($baseDir.'/source/',$baseDir.'/compiled/');

$temp->assign('title','学PHP的小蚂蚁');

$temp->assign('name','小蚂蚁');

$temp->getSourceTemplate('index');

$temp->compileTemplate();

$temp->display();

?>

类库很简单,主要是领悟一下模板引擎的工作思路,顺便在领悟一下OOP的编程思路。

preg_match_all()不但能获取总模式,还能将子模式匹配出来。0键为总模式匹配结果。1~n为子模式。

preg_replace()同理  $1 和 \\1 是一样的。

{#$title#}

我的名字是:{#$name#}

正则表达式 php 模板,PHP中正则表达式回顾(4)--编写一个非常简单而且山寨的smarty模板引擎...相关推荐

  1. c语言中如何设计和编写一个应用系统?

    C程序中,如何设计和编写一个应用系统? 一. C语言文件的操作 1. 文件操作的基本方法: C语言将计算机的输入输出设备都看作是文件.例如,键盘文件.屏幕文件等. 向屏幕输出一个信息,例如" ...

  2. 编写一个程序。要求输入5个学生的成绩(从0到100的整数)并将这5个数保存到文件“data.txt”中,然后再编写一个程序,从文件“data.txt”中读取这5个学生的成绩,计算并输出他们的平均数,然

    编写一个程序.要求输入5个学生的成绩(从0到100的整数)并将这5个数保存到文件"data.txt"中,然后再编写一个程序,从文件"data.txt"中读取这5 ...

  3. linux正则表达式脚本实例,PowerShell中正则表达式使用例子

    本文介绍PowerShell中正则表达式的使用,PowerShell的正则表达式与微软其它语言的正则表达式是一样的,使用非常方便. 正则表达式本身是怎么回事,本文不做讨论,反正PowerShell还是 ...

  4. java 正则表达式 table_JavaEdge/Java/Java中正则表达式.md at master · VegTableBird/JavaEdge · GitHub...

    主要用到的是这两个类 - java.util.regex.Pattern - java.util.regex.Matcher. Pattern对应正则表达式,一个Pattern与一个String对象关 ...

  5. 查找子串在母串中的位置、编写一个函数实现字符串拼接【数据结构实验报告算法详解】

    文章目录 一.查找子串在母串中的位置 二.一个实现字符串拼接的函数 一.查找子串在母串中的位置 #include<iostream> using namespace std;int Sea ...

  6. mysql中正则表达式的用法_Mysql中正则表达式Regexp常见用法

    Mysql中Regexp常见用法 模糊匹配,包含特定字符串 # 查找content字段中包含"车友俱乐部"的记录 select * from club_content where ...

  7. oracle sql的正则表达式,Oracle SQL 语句中正则表达式的应用

    REGEXP_LIKE(匹配) REGEXP_INSTR (包含) REGEXP_REPLACE(替换) REGEXP_SUBSTR(提取) 如 手机号码的表达式: ^[1]{1}[35]{1}[[: ...

  8. PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP

    smarty模板引擎类简单工作原理 利用Smarty 模板引擎类对模板文件中的变量进行编译,编译过程其实就是利用正则表达式翻译成PHP文件.例如 模板文件中{$title} 利用正则表达式找到并替换成 ...

  9. php 高洛峰 正则,PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP

    smarty模板引擎类简单工作原理 利用Smarty 模板引擎类对模板文件中的变量进行编译,编译过程其实就是利用正则表达式翻译成PHP文件.例如 模板文件中{$title}利用正则表达式找到并替换成 ...

最新文章

  1. error:use of undeclared identifier
  2. vsphere6.0故障:关于vCenter Appliance6.0磁盘爆满和WEB503错误问题
  3. [Linux] Linux命令之pstree - 以树状图显示进程间的关系
  4. 从数据库获取数据到Servlet.
  5. loacallhost:80被占用解决方法
  6. 作为前端程序员:你必须知道的常用英语词汇!!全是干货!!!
  7. Excel表格添加下拉多选
  8. 深度学习名词(中英文对照)
  9. Verilog学习日志(2021.7.31)
  10. Vista和Win2008中如何卸载IE8
  11. DataTable转换为ListT或者DataRow转换为T
  12. STM32———高级定时器的死区时间计算方法
  13. 微信小程序_map组件实现定位
  14. Linux中配置Aria2 RPC Server
  15. 8 个测试人员不背锅小建议
  16. 手工搭建基于ABP的框架(3) - 登录,权限控制与日志
  17. 2021极客大挑战web部分wp
  18. 出海、上市,分众传媒还能再造一个“分众”吗?
  19. 视频教程-企业级电商大数据推荐系统实战-大数据
  20. 关于DNS的域名解析

热门文章

  1. 算法与数据结构(一)
  2. python语法问题
  3. sonarqube下载地址
  4. 浏览器网页上的SSH终端webssh:pip install webssh
  5. linux grep -v反向搜索:不显示目标字符串
  6. Win10自带的邮件客户端配置腾讯企业邮箱账号
  7. JVM调优:-Xms40M -Xmx60M 指定堆的最小、最大大小
  8. spring cloud常用组件介绍
  9. eureka源码:开启eureka server
  10. SpringBoot启动banner更改