PHP中正則表達式回顧(4)--編寫一個很是簡單並且山寨的smarty模板引擎

    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.
函數

相關文章
相關標籤/搜索