PHP的正則表達式今天就結束了,遙想幾年前初次接觸的時候,感受這玩意真心玩不轉啊,而時至今日,感受這也沒有什麼難以理解的,確實仍是有很大進步的,尤爲是對smarty模板引擎有了一個更爲清晰的認識。正則表達式學到最後,老是會拋出這個編寫一個山寨的smarty模板引擎的話題出來練練手,今天就在大師的指導下,編寫了這麼一個山寨smarty,做爲此次複習正則的一個句點吧。
php
<?php 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的編程思路。
html
preg_match_all()不但能獲取總模式,還能將子模式匹配出來。0鍵爲總模式匹配結果。1~n爲子模式。
正則表達式
preg_replace()同理 $1 和 \\1 是同樣的。
編程
<! doctype <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>{#$title#}</title> </head> <body> 個人名字是:{#$name#} </body> </html>
正則表達式結束。over.
函數