正则表达式 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#}
總結
以上是生活随笔為你收集整理的正则表达式 php 模板,PHP中正则表达式回顾(4)--编写一个非常简单而且山寨的smarty模板引擎...的全部內容,希望文章能夠幫你解決所遇到的問題。