日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 模板解析,关于模板的原理和解析

發布時間:2024/9/27 php 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 模板解析,关于模板的原理和解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。