PHPテンプレート解析クラスの例

17796 ワード

PHPテンプレート解析クラスの例を示します.皆さんの参考にしてください.具体的には以下の通りです.

';//     
 private $template_c = '';//    
 private $template_path = '';//       
 private $template_name = '';//     index.html
 //            
 private $tag_foreach = array('from', 'item', 'key');
 private $tag_include = array('file');//             
 public function __construct($conf) {
  $this->conf = &$conf;
  $this->template_c = $this->conf['template_config']['template_c'];//    
  $this->_tpl_suffix = $this->tpl_suffix();
 }
 private function str_replace($search, $replace, $content) {
  if(empty($search) || empty($replace) || empty($content)) return false;
  return str_replace($search, $replace, $content);
 }
 /**
  * preg_match_all
  * @param $pattern   
  * @param $content   
  * @return array
  */
 private function preg_match_all($pattern, $content) {
  if(empty($pattern) || empty($content)) core::show_error('        !');
  preg_match_all("/".$this->template_tag_left.$pattern.$this->template_tag_right."/is", $content, $match);
  return $match;
 }
 /**
  *        
  */
 public function tpl_suffix() {
  $tpl_suffix = empty($this->conf['template_config']['template_suffix']) ? 
       $this->tpl_suffix : 
       $this->conf['template_config']['template_suffix'] ;
  return $tpl_suffix;
 }
 /**
  *       
  * @return 
  */
 public function assign($key, $value) {
  $this->vars[$key] = $value;
 }
 /**
  *     
  * @param 
  *      1
  * $this->view->display('error', 'comm/');
  *      TPL      ,  comm/   tpl/comm/error.html
  *      2
  * $this->view->display('errorfile'); 
  *              
  *         http://heartphp/admin/index,         tpl/admin/index/errorfile.html
  * @return 
  */
 public function display($filename = '', $view_path = '') {
  $tpl_path_arr = $this->get_tpl($filename, $view_path);//  TPL                  
  if(!$tpl_path_arr) core::show_error($filename.$this->_tpl_suffix.'     ');
  //    
  $this->view_path_param = $view_path;//            
  $this->compile();
 }
 /**
  *      
  * @param 
  * @return 
  */
 private function compile() {
  $filepath = $this->template_path.$this->template_name;
  $compile_dirpath = $this->check_temp_compile();
  $vars_template_c_name = str_replace($this->_tpl_suffix, '', $this->template_name);
  $include_file = $this->template_replace($this->read_file($filepath), $compile_dirpath, $vars_template_c_name);//  
  if($include_file) {
   $this->read_config() && $config = $this->read_config();
   extract($this->vars, EXTR_SKIP);
   [url=home.php?mod=space&uid=48608]@include[/url] $include_file;
  }
 }
 /**
  *           
  */
 protected function read_config() {
  if(file_exists(SYSTEM_PATH.'conf/config.php')) {
   @include SYSTEM_PATH.'conf/config.php'; 
   return $config;
  }
  return false;
 }
 /**
  *       
  * @param $str   
  * @param $compile_dirpath       
  * @param $vars_template_c_name        
  * @return     PHP     
  */
 private function template_replace($str, $compile_dirpath, $vars_template_c_name) {
  if(empty($str)) core::show_error('      !');
  //      
  $compile_path = $compile_dirpath.$vars_template_c_name.$this->tpl_compile_suffix;//    
  if(is_file($compile_path)) {
   //$header_content = $this->get_compile_header($compile_path);
   //$compile_date = $this->get_compile_header_comment($header_content);
   $tpl_filemtime = filemtime($this->template_path.$this->template_name);
   $compile_filemtime = filemtime($compile_path);
   //echo $tpl_filemtime.'=='.date('Y-m-d H:i:s', $tpl_filemtime).'
'; //echo $compile_filemtime.'=='.date('Y-m-d H:i:s', $compile_filemtime); // include // include , DEBUG include , , , , DEBUG=1 include 。 , if($tpl_filemtime > $compile_filemtime || DEBUG) { $ret_file = $this->compile_file($vars_template_c_name, $str, $compile_dirpath); } else { $ret_file = $compile_path; } } else {// $ret_file = $this->compile_file($vars_template_c_name, $str, $compile_dirpath); } return $ret_file; } /** * * @param string $str * @return html */ private function body_content($str) { // $str = $this->parse($str); $header_comment = "Create On##".time()."|Compiled from##".$this->template_path.$this->template_name; $content = " if(!defined('IS_HEARTPHP')) exit('Access Denied');/*{$header_comment}*/?>\r
$str"; return $content; } /** * * @param $content */ private function parse($content) { //foreach $content = $this->parse_foreach($content); //include $content = $this->parse_include($content); //if $content = $this->parse_if($content); //elseif $content = $this->parse_elseif($content); // $content = $this->parse_comm($content); // PHP $content = $this->parse_php($content); return $content; } /** * echo */ private function parse_echo($content) { } /** * PHP * @param $content html * @return html HTML */ private function parse_php($content){ if(empty($content)) return false; $content = preg_replace("/".$this->template_tag_left."(.+?)".$this->template_tag_right."/is", "", $content); return $content; } /** * if * * zhang * * liang * * zhangliang * */ private function parse_if($content) { if(empty($content)) return false; //preg_match_all("/".$this->template_tag_left."if\s+(.*?)".$this->template_tag_right."/is", $content, $match); $match = $this->preg_match_all("if\s+(.*?)", $content); if(!isset($match[1]) || !is_array($match[1])) return $content; foreach($match[1] as $k => $v) { //$s = preg_split("/\s+/is", $v); //$s = array_filter($s); $content = str_replace($match[0][$k], "", $content); } return $content; } private function parse_elseif($content) { if(empty($content)) return false; //preg_match_all("/".$this->template_tag_left."elseif\s+(.*?)".$this->template_tag_right."/is", $content, $match); $match = $this->preg_match_all("elseif\s+(.*?)", $content); if(!isset($match[1]) || !is_array($match[1])) return $content; foreach($match[1] as $k => $v) { //$s = preg_split("/\s+/is", $v); //$s = array_filter($s); $content = str_replace($match[0][$k], "", $content); } return $content; } /** * include include , include * DEBUG * * @param $content * @return html */ private function parse_include($content) { if(empty($content)) return false; //preg_match_all("/".$this->template_tag_left."include\s+(.*?)".$this->template_tag_right."/is", $content, $match); $match = $this->preg_match_all("include\s+(.*?)", $content); if(!isset($match[1]) || !is_array($match[1])) return $content; foreach($match[1] as $match_key => $match_value) { $a = preg_split("/\s+/is", $match_value); $new_tag = array(); // foreach($a as $t) { $b = explode('=', $t); if(in_array($b[0], $this->tag_include)) { if(!empty($b[1])) { $new_tag[$b[0]] = str_replace("\"", "", $b[1]); } else { core::show_error(' !'); } } } extract($new_tag); // foreach($this->conf['view_path'] as $v){ $conf_view_tpl = $v.$file;//include if(is_file($conf_view_tpl)) { $c = $this->read_file($conf_view_tpl); $inc_file = str_replace($this->_tpl_suffix, '', basename($file)); $this->view_path_param = dirname($file).'/'; $compile_dirpath = $this->check_temp_compile(); $include_file = $this->template_replace($c, $compile_dirpath, $inc_file);// break; } else { core::show_error(' , :'. $conf_view_tpl); } } $content = str_replace($match[0][$match_key], '', $content); } return $content; } /** * foreach * * @param $content * @return html */ private function parse_foreach($content) { if(empty($content)) return false; //preg_match_all("/".$this->template_tag_left."foreach\s+(.*?)".$this->template_tag_right."/is", $content, $match); $match = $this->preg_match_all("foreach\s+(.*?)", $content); if(!isset($match[1]) || !is_array($match[1])) return $content; foreach($match[1] as $match_key => $value) { $split = preg_split("/\s+/is", $value); $split = array_filter($split); $new_tag = array(); foreach($split as $v) { $a = explode("=", $v); if(in_array($a[0], $this->tag_foreach)) {// $new_tag[$a[0]] = $a[1]; } } $key = ''; extract($new_tag); $key = ($key) ? '$'.$key.' =>' : '' ; $s = ''; $content = $this->str_replace($match[0][$match_key], $s, $content); } return $content; } /** * */ private function parse_comm($content) { $search = array( "/".$this->template_tag_left."\/foreach".$this->template_tag_right."/is", "/".$this->template_tag_left."\/if".$this->template_tag_right."/is", "/".$this->template_tag_left."else".$this->template_tag_right."/is", ); $replace = array( "", "", "" ); $content = preg_replace($search, $replace, $content); return $content; } /** * * @param string $path * @return */ private function check_temp_compile() { //$paht = $this->template_c. $tpl_path = ($this->view_path_param) ? $this->view_path_param : $this->get_tpl_path() ; $all_tpl_apth = $this->template_c.$tpl_path; if(!is_dir($all_tpl_apth)) { $this->create_dir($tpl_path); } return $all_tpl_apth; } /** * * @param string $path * @return */ private function read_file($path) { //$this->check_file_limits($path, 'r'); if(($r = @fopen($path, 'r')) === false) { core::show_error(' , !'); } $content = fread($r, filesize($path)); fclose($r); return $content; } /** * * @param string $filename * @param string $content * @return */ private function compile_file($filename, $content, $dir) { if(empty($filename)) core::show_error("{$filename} Creation failed"); $content = $this->body_content($content);// //echo ' ====='; $f = $dir.$filename.$this->tpl_compile_suffix; //$this->check_file_limits($f, 'w'); if(($fp = @fopen($f, 'wb')) === false) { core::show_error($f.'
, .'); } // flock flock($fp, LOCK_EX + LOCK_NB); fwrite($fp, $content, strlen($content)); flock($fp, LOCK_UN + LOCK_NB); fclose($fp); return $f; } /** * * @param [$path] [ ] * @param [status] [w=write, r=read] */ public function check_file_limits($path , $status = 'rw') { clearstatcache(); if(!is_writable($path) && $status == 'w') { core::show_error("{$path}
, ."); } elseif(!is_readable($path) && $status == 'r') { core::show_error("{$path}
, ."); } elseif($status == 'rw') {//check wirte and read if(!is_writable($path) || !is_readable($path)) { core::show_error("{$path}
, "); } } } /** * * @param string $filepath * @param number $line * @return */ /* private function get_compile_header($filepath, $line = 0) { if(($file_arr = @file($filepath)) === false) { core::show_error($filepath.'
, !'); } return $file_arr[0]; } */ /** * * @param string $cotnent * @return */ /* private function get_compile_header_comment($content) { preg_match("/\/\*(.*?)\*\//", $content, $match); if(!isset($match[1]) || empty($match[1])) core::show_error(' !'); $arr = explode('|', $match[1]); $arr_date = explode('##', $arr[0]); return $arr_date[1]; } */ /** * * @param string $filename * @param string $view_path * @return */ private function get_tpl($filename, $view_path) { empty($filename) && $filename = $this->tpl_name; // foreach($this->conf['view_path'] as $path) { if($view_path) {// tpl $tpl_path = $path.$view_path; $view_file_path = $tpl_path.$filename.$this->_tpl_suffix; } else {// , , $view_file_path = ($tpl_path = $this->get_tpl_path($path)) ? $tpl_path.$filename.$this->_tpl_suffix : exit(0); } if(is_file($view_file_path)) { // $this->template_path = $tpl_path;// $this->template_name = $filename.$this->_tpl_suffix; return true; } else { core::show_error($filename.$this->_tpl_suffix.' '); } } } /** * * @param string $path * @return URL D M */ private function get_tpl_path($path = '') { core::get_directory_name() && $path_arr[0] = core::get_directory_name(); core::get_controller_name() && $path_arr[1] = core::get_controller_name(); (is_array($path_arr)) ? $newpath = implode('/', $path_arr) : core::show_error(' !') ; return $path.$newpath.'/'; } /** * * @param string $path * @return */ private function create_dir($path, $mode = 0777){ if(is_dir($path)) return false; $dir_arr = explode('/', $path); $dir_arr = array_filter($dir_arr); $allpath = ''; $newdir = $this->template_c; foreach($dir_arr as $dir) { $allpath = $newdir.'/'.$dir; if(!is_dir($allpath)) { $newdir = $allpath; if(!@mkdir($allpath, $mode)) { core::show_error( $allpath.'
, !'); } chmod($allpath, $mode); } else { $newdir = $allpath; } } return true; } public function __destruct(){ $this->vars = null; $this->view_path_param = null; } }

本稿で述べたphpプログラム設計に役立つことを願っています.