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

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#}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值