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