php 模板解析,关于模板的原理和解析
PHP – 關于模板的原理和解析
將PHP代碼和靜態HTML代碼進行分離,使代碼的可讀性和維護性得到顯著提高。
使用模板引擎:
我們所說的模板是web模板,是主要由HTML標記組成的語言來編寫的語言,但也有如何表示包含動態生成內容的方式(解析標簽)。模板引擎是一種軟件庫,允許我們從模板生成HTML代碼,并制定要包含的動態內容。
模板引擎的特點:
1、 鼓勵分離:讓各個系統的可讀性和維護性得到提高。
2、 促進分工:使得程序員和美工去專心處理自己的設計
3、 比PHP更容易解析:編譯文件和緩存文件加載更快,占資源更少。
4、 增加安全性:可限制模板設計師進行不安全的操作,避免誤刪誤訪問等。
解析類:
//模板解析類
class?Parser{
//創建一個字段保存模板文件里的內容
private?$_tpl;
//構造方法,用于接收模板文件
public?function?__construct($_tplFile){
if?(!$this->_tpl?=?file_get_contents($_tplFile)){
exit('模板文件讀取錯誤!');
}
}
//解析普通變量
private?function?parVar(){
//?preg_match()?執行一個正則表達式匹配???如果第二個參數中包含第一個參數,則返回值為1
//?preg_replace()?執行一個正則表達式的搜索和替換???參數1:要被替換的內容?參數2:被替換成的內容??參數3:包含替換內容的變量
//?正則表達式:'/\{\$([\w]+)\}/'?表示匹配{$?}?$符后可以為?0-9?,a-z?,A-Z?的任何值。?即等價為定義的變量
$_patten?=?'/\{\$([\w]+)\}/';
if?(preg_match($_patten,$this->_tpl)){
$this->_tpl?=?preg_replace($_patten,"<?php ?echo?\$this->_vars['$1'];?>",$this->_tpl);
}
}
//解析if語句
private?function?parIf(){
//正則表達式???\s?:匹配一個或多個空白???\w?:匹配a-z,0-9,A-Z和下劃線的字符串
$_pattenIf?=?'/\{if\s+\$([\w]+)\}/';
$_pattenEndIf?=?'/\{\/if\}/';
$_pattenElse?=?'/\{else\}/';
if?(preg_match($_pattenIf,$this->_tpl)){
if?(preg_match($_pattenEndIf,$this->_tpl)){
$this->_tpl?=?preg_replace($_pattenIf,"<?php ?if?(\$this->_vars['$1']){??>",$this->_tpl);
$this->_tpl?=?preg_replace($_pattenEndIf,"<?php ?}??>",$this->_tpl);
if?(preg_match($_pattenElse,$this->_tpl)){
$this->_tpl?=?preg_replace($_pattenElse,"<?php ?}else{??>",$this->_tpl);
}
}else{
exit('if語句沒有關閉!');
}
}
}
//解析include語句
private?function?parInclude(){
$_patten?=?'/\{include\s+file=\"([\w\.\-]+)\"\}/';
//?preg_match()的第三個參數??將第一個參數和其分組文件以數組的形式表達??[0]=>{include?file="test.php"}?[1]=>test.php
if?(preg_match($_patten,$this->_tpl,$_file)){
if?(!file_exists($_file[1])?||?empty($_file)){
exit('包含文件出錯!');
}
$this->_tpl?=?preg_replace($_patten,"<?php ?include?'$1';??>",$this->_tpl);
}
}
//解析PHP代碼注釋
private?function?parCommon(){
$_patten?=?'/\{#\}(.*)\{#\}/';
//?正則表達式???(.*?)表示任何內容
if?(preg_match($_patten,$this->_tpl)){
$this->_tpl?=?preg_replace($_patten,"<?php ?/*?$1?*/??>",$this->_tpl);
}
}
//對外共方法
public?function?compile($_parFile){
//解析模板內容
$this->parVar();
$this->parIf();
$this->parCommon();
$this->parInclude();
//生成編譯文件
//?file_put_contents()?將一個字符串寫入文件
//?file_get_contents()?將整個文件讀入一個字符串
if?(!file_put_contents($_parFile,$this->_tpl)){
exit('編譯文件生成出錯!');
}
}
}
模板引擎的整個過程:
1.???? 當瀏覽器請求index.php文件時,實例化模板類對象$_tpl = new Templates();
2.???? 當template實例化的時候,生成兩個數組,一個用來存放模板變量,另一個存放系統變量,通過構造方法,判斷文件夾是否存在,同時通過XML文件將系統變量數組初始化
3.???? 通過模板類template的注入方法,assign(),將對應模板index.tpl中變量的index.php內容注入到模板類的私有變量,完成初始化
4.???? 模板類template類顯示方法display()通過實例化解析parser,將取到的注入變量通過解析類進行解析(即替換)
5.???? 解析(替換)后,將文件寫入PHP、HTML混全文件
6.???? 通過template類的顯示方法將文件輸出
緩存
1.???? 第一次執行顯示方法時,將會把PHP、HTML混合文件,生成純靜態的緩存文件
2.???? 調用緩存文件,顯示頁面
3.???? 當瀏覽器再次調用顯示方法時,首先根據各文件的最后修改時間,判斷是否重新生成緩存文件或直接調用已存在的緩存文件
重點
通過正則表達式進行字符串的替換
本文參考:
總結
以上是生活随笔為你收集整理的php 模板解析,关于模板的原理和解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平安银行信用卡申请进度查询
- 下一篇: 债券逆回购有风险吗