首頁  >  文章  >  後端開發  >  php正規表示式—仿smarty

php正規表示式—仿smarty

WBOY
WBOY原創
2016-08-08 09:22:071245瀏覽
    /**
類別名為Smarty是自訂的模板引擎
透過該類別物件載入範本檔案並解析,解析後的結果輸出 
*/
class Smarty {
public $template_dir = 'templates';       //定義模板文件存放的目錄 
public $compile_dir = 'templates_c';      / /定義透過範本引擎組合後檔案存放目錄
public $left_delimiter  =  ' public $) ter5;在模板中嵌入動態資料變數的右邊定界符號
private $tpl_vars = array();              //內部使用的臨時變數
) **  tpl_var , $value = null) {   

if ($tpl_var != '')                   
}         /**將PHP中分配的值會儲存到成員屬性$tpl_vars中,用於將板中對應的變數進行替換 @param
string$tplvarvar@paramstring$tpl下標,要和模板中的變數名稱對應   @param
mixed
$value需要一個標量類型的值,用來分配給模板中變數的值 
需要一個標量類型的值,用來分配給模板中變數的值 





* /
         function display($fileName) { 
/* 到指定的目錄中尋找範本檔案*/
$tplFile處理過的範本檔案不存在,則退出並回報錯誤*/
if(!file_exists($tplFile)) {              

die("存在於$t*");
}
            /* 取得組合中的範本文件,檔案中的內容都是已取代的*/
_$comFileName = $this->compile_dir.Name/com_ 。 )) {

/* 呼叫內部替換範本方法*/
$repContent = $this->tpl_replace(file_get_contents($tplFile));  
/* 存檔由系統組合後的腳本檔案?
file_put_contents($comFileName, $repContent);
}
/* 包含處理後的範本檔案輸出給客戶端*/
include($comFile); }
/**內部使用的私有方法,使用正規表示式將範本檔案''中的語句替換為對應的值或PHP程式碼 
@param
string
@param
string
文件中讀入的全部內容字串  @return$repContent回傳替換後的字串
*/private function tpl_replace($content) {
/* 將左右定界符號中,有影響正則的特殊符號轉義 例如,轉義例如, */
$left = preg_quote($this->left_delimiter, '/');
$right = preg_quote($this->right_delimiter, '/');$right = preg_quote($this->right_delimiter, '/');
模板中各種識別符的正規表示式的模式數組*/
$pattern = array(       
/* 匹配模板中變數,例如,""  /* 匹配模板中變數,例如,""  /*//
*/ '.$left.'s*$([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)s*'.$right.'/i',
/* 匹配模板中if標識符,例如" " */
'/'.$left.'s* ifs*(.+?)s*'.$right.'(.+?)'.$left.'s*/ifs*'.$right.'/ies', 
/* 匹配elseif標識符, 例如"" */
'/'.$left.'s*elses*ifs*(.+?)s*'.$right.'/ies ', 
/* 匹配else標識符, 例如"" */
'/'.$left.'s*elses*'.$right.'/is',   
/* 用來匹配模板中的loop標識符,用來遍歷數組中的值,  例如" " */
'/'.$left. 's*loops+$(S+)s+$([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)s*'.$right.'(.+?)'.$left .'s*/loops*'.$right.'/is',
/* 用來遍歷數組中的鍵和值,例如" $value }> "  */
'/'.$left.'s*loops+$(S+)s+$([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)s *=>s*$(S+)s*'.$right.'(.+?)'.$left.'s*/loop s*'.$right.'/is', 
/* 匹配include標識符, 例如,'' */
'/'.$left.'s*includes+["']?(.+?)["']?s *'.$right.'/ie'                

);*
/*中使用正則的表達式
/place 
/* 替換模板中的變數tpl_vars["var"]; */
'tpl_vars["${1}"]; ?> ',      
/* 替換模板中的if字串 */
'$this->stripvtags('','${2}')',

/* 取代elseif的字串 */'$this->stripvtags('',"")',  
/* 替換else的字串 */
'',  /* 以下兩個用來取代模板中的loop識別碼為foreach格式*/
'tpl_vars["${1}"] as $this->tpl_vars["$ {2}"]) { ?>${3}',  
'tpl_vars["${1}"] as $this->tpl_vars["${2}"] => $this->tpl_vars["$ {3}"]) { ?>${4}',    
/*替換include的字串*/
'file_get_contents($this->template_dir."/${1 }")'        
);

/* 使用正規替換函數處理 */
$repContent = preg_replace($pattern, $replacement, $content);
/* 如果還有要替換的標識,遞歸調用自己再次替換*/
if(preg_match('/'.$left.'([^('.$right.')]{ 1,})'.$right.'/', $repContent)) {       
$repContent = $this->tpl_replace($repContent);        

/* 返回替換後的字串 */
return $repContent;      
}

         /**
內部使用的私人方法,用來將條件語句中使用的變數替換為對應的值
@paramstring$expr 提供範本中條件語句的開始標記中條件
string$statement  提供範本中條件語句的結束標記 @return
strin將處理後的條件語句連接後傳回strin*/

$ var_pattern = '/s*$([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)s*/is'; 
/* 將變數替換為值*/
/* 將變數替換為值*/
/* 將變數替換為值*/
$expr = preg_replace($var_pattern, '$this->tpl_vars["${1}"]', $expr); 
/* 將開始標記中的引號轉義替換*/
/* 將開始標記中的引號轉義替換*/
$expr = str_replace("\"", """, $expr);
/* 替換語句體和結束標記中的引號*/
$statement = str_replace("\""", """, $" statement); 
/* 將處理後的條件語句連接後回傳*/
return $expr.$statement;                 
}

}

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

以上就介紹了php正規表示式—仿smarty,包含了方面的內容,希望對PHP教程有興趣的朋友有幫助。 🎜 🎜 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn