程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php實戰第三天

php實戰第三天

編輯:關於PHP編程

 
\ 
做了一個新的布局,感覺比以前的舒服.

jquery的特效也修改了.移到到內容區塊就把文本的顏色改成漂亮的藍色.移除去掉.


[javascript]  // JavaScript Document  
$(document).ready(function(e) { 
    $user=$("div .user"); 
    $text=$("div .text"); 
     
    $("div .content").each(function(index){ 
        $(this).mousemove(function(){ 
         
        $user.eq(index).css("color","#0A8CD2"); 
 
    //  $user.eq(index).css("background","#FFE6AD");  
    //  $text.eq(index).css("background","#FFFDF6");  
         
        }).mouseout(function(){ 
         
        $user.eq(index).css("color","#000"); 
 
    //  $user.eq(index).css("background","#E6F0F9");  
    //  $text.eq(index).css("background","#F8FBFD");  
        }); 
    }); 
 
     
}); 

// JavaScript Document
$(document).ready(function(e) {
 $user=$("div .user");
 $text=$("div .text");
 
 $("div .content").each(function(index){
  $(this).mousemove(function(){
  
  $user.eq(index).css("color","#0A8CD2");

 // $user.eq(index).css("background","#FFE6AD");
 // $text.eq(index).css("background","#FFFDF6");
  
  }).mouseout(function(){
  
  $user.eq(index).css("color","#000");

 // $user.eq(index).css("background","#E6F0F9");
 // $text.eq(index).css("background","#F8FBFD");
  });
 });

   
});

數據庫中增加了 time字段,類型為int,長度為 11;

添加留言時,調用 time()函數返回的ux時間戳,

數據庫中讀出時,調用 date()函數


[php]  date('Y-m-d H:i:s',$value['time']);//對時間戳進行轉換為日期 

 date('Y-m-d H:i:s',$value['time']);//對時間戳進行轉換為日期
然後還添加了一個分頁代碼


[php]  function index() { 
 
    include "page.class.php"; 
             
    $rows = $this->db->count('select * from data'); 
 
    $page = new Page($rows, 5, ""); 
 
    $page -> set("head", "條留言"); 
    $page -> set("first", "首頁") 
              -> set("prev", "上一頁") 
                      -> set("next", "下一頁") 
                      -> set("last", "尾頁");          
 
    $list=$this->db 
           ->order('id DESC') 
           ->limit($page->getLimit()) 
           ->select(); 
     
    $this->assign("page",$page->fpage(0,3,4,5,6)); 
    $this->assign("list",$list); 
    $this->assign("title", "我的留言板");    //分配標題變量給頭部模板header.tpl  
     
 
    $this->display();                     //包括替換模板中的變量輸出模板頁面  

  function index() {

   include "page.class.php";
     
   $rows = $this->db->count('select * from data');

   $page = new Page($rows, 5, "");
 
   $page -> set("head", "條留言");
   $page -> set("first", "首頁")
            -> set("prev", "上一頁")
                    -> set("next", "下一頁")
                    -> set("last", "尾頁");       
 
   $list=$this->db
       ->order('id DESC')
        ->limit($page->getLimit())
        ->select();
   
   $this->assign("page",$page->fpage(0,3,4,5,6));
   $this->assign("list",$list);
   $this->assign("title", "我的留言板");    //分配標題變量給頭部模板header.tpl
   
 
   $this->display();                     //包括替換模板中的變量輸出模板頁面
  }
效果還不錯噢.

page.class.php 源碼附上

[php]  <?php 
    /**
        file: page.class.php 
        完美分頁類 Page 
        @微涼 QQ496928838
    */ 
    class Page { 
        private $total;                         //數據表中總記錄數  
        private $listRows;                      //每頁顯示行數  
        private $limit;                         //SQL語句使用limit從句,限制獲取記錄個數  
        private $uri;                           //自動獲取url的請求地址  
        private $pageNum;                       //總頁數  
        private $page;                          //當前頁     
        private $config = array( 
                            'head' => "條記錄",  
                            'prev' => "上一頁",  
                            'next' => "下一頁",  
                            'first'=> "首頁",  
                            'last' => "末頁" 
                        );                      //在分頁信息中顯示內容,可以自己通過set()方法設置  
        private $listNum = 10;                  //默認分頁列表顯示的個數  
 
        /**
            構造方法,可以設置分頁類的屬性
            @param  int $total      計算分頁的總記錄數
            @param  int $listRows   可選的,設置每頁需要顯示的記錄數,默認為25條
            @param  mixed   $query  可選的,為向目標頁面傳遞參數,可以是數組,也可以是查詢字符串格式
            @param  bool    $ord    可選的,默認值為true, 頁面從第一頁開始顯示,false則為最後一頁
         */ 
        public function __construct($total, $listRows=25, $query="", $ord=true){ 
            $this->total = $total; 
            $this->listRows = $listRows; 
            $this->uri = $this->getUri($query); 
            $this->pageNum = ceil($this->total / $this->listRows); 
            /*以下判斷用來設置當前面*/ 
            if(!empty($_GET["page"])) { 
                $page = $_GET["page"]; 
            }else{ 
                if($ord) 
                    $page = 1; 
                else 
                    $page = $this->pageNum; 
            } 
 
            if($total > 0) { 
                if(preg_match('/\D/', $page) ){ 
                    $this->page = 1; 
                }else{ 
                    $this->page = $page; 
                } 
            }else{ 
                $this->page = 0; 
            } 
             
            $this->limit = "LIMIT ".$this->getLimit(); 
        } 
 
        /**
            用於設置顯示分頁的信息,可以進行連貫操作
            @param  string  $param  是成員屬性數組config的下標
            @param  string  $value  用於設置config下標對應的元素值
            @return object          返回本對象自己$this, 用於連慣操作
         */ 
        function set($param, $value){ 
            if(array_key_exists($param, $this->config)){ 
                $this->config[$param] = $value; 
            } 
            return $this; 
        } 
         
        /* 不是直接去調用,通過該方法,可以使用在對象外部直接獲取私有成員屬性limit和page的值 */ 
        function __get($args){ 
            if($args == "limit" || $args == "page") 
                return $this->$args; 
            else 
                return null; 
        } 
         
        /**
            按指定的格式輸出分頁
            @param  int 0-7的數字分別作為參數,用於自定義輸出分頁結構和調整結構的順序,默認輸出全部結構
            @return string  分頁信息內容
         */ 
        function fpage(){ 
            $arr = func_get_args(); 
 
            $html[0] = " 共<b> {$this->total} </b>{$this->config["head"]} "; 
            $html[1] = " 本頁 <b>".$this->disnum()."</b> 條 "; 
            $html[2] = " 本頁從 <b>{$this->start()}-{$this->end()}</b> 條 "; 
            $html[3] = " <b>{$this->page}/{$this->pageNum}</b>頁 "; 
            $html[4] = $this->firstprev(); 
            $html[5] = $this->pageList(); 
            $html[6] = $this->nextlast(); 
            $html[7] = $this->goPage(); 
 
            $fpage = '<div style="font:12px \'\5B8B\4F53\',san-serif;">'; 
            if(count($arr) < 1) 
                $arr = array(0, 1,2,3,4,5,6,7); 
                 
            for($i = 0; $i < count($arr); $i++) 
                $fpage .= $html[$arr[$i]]; 
         
            $fpage .= '</div>'; 
            return $fpage; 
        } 
         
        /* 格式為 1,5,*/ 
        function getLimit(){ 
            if($this->page > 0) 
                return ($this->page-1)*$this->listRows.", {$this->listRows}"; 
            else 
                return 0; 
        } 
 
        /* 在對象內部使用的私有方法,用於自動獲取訪問的當前URL */ 
        private function getUri($query){     
            $request_uri = $_SERVER["REQUEST_URI"];  
            $url = strstr($request_uri,'?') ? $request_uri :  $request_uri.'?'; 
             
            if(is_array($query)) 
                $url .= http_build_query($query); 
            else if($query != "") 
                $url .= "&".trim($query, "?&"); 
         
            $arr = parse_url($url); 
 
            if(isset($arr["query"])){ 
                parse_str($arr["query"], $arrs); 
                unset($arrs["page"]); 
                $url = $arr["path"].'?'.http_build_query($arrs); 
            } 
             
            if(strstr($url, '?')) { 
                if(substr($url, -1)!='?') 
                    $url = $url.'&'; 
            }else{ 
                $url = $url.'?'; 
            } 
             
            return $url; 
        } 
 
        /* 在對象內部使用的私有方法,用於獲取當前頁開始的記錄數 */ 
        private function start(){ 
            if($this->total == 0) 
                return 0; 
            else 
                return ($this->page-1) * $this->listRows+1; 
        } 
 
        /* 在對象內部使用的私有方法,用於獲取當前頁結束的記錄數 */ 
        private function end(){ 
            return min($this->page * $this->listRows, $this->total); 
        } 
 
        /* 在對象內部使用的私有方法,用於獲取上一頁和首頁的操作信息 */ 
        private function firstprev(){ 
            if($this->page > 1) { 
                $str = " <a href='{$this->uri}page=1'>{$this->config["first"]}</a> "; 
                $str .= "<a href='{$this->uri}page=".($this->page-1)."'>{$this->config["prev"]}</a> ";         
                return $str; 
            } 
 
        } 
     
        /* 在對象內部使用的私有方法,用於獲取頁數列表信息 */ 
        private function pageList(){ 
            $linkPage = " <b>"; 
             
            $inum = floor($this->listNum/2); 
            /*當前頁前面的列表 */ 
            for($i = $inum; $i >= 1; $i--){ 
                $page = $this->page-$i; 
 
                if($page >= 1) 
                    $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> "; 
            } 
            /*當前頁的信息 */ 
            if($this->pageNum > 1) 
                $linkPage .= "<span style='padding:1px 2px;background:#BBB;color:white'>{$this->page}</span> "; 
             
            /*當前頁後面的列表 */ 
            for($i=1; $i <= $inum; $i++){ 
                $page = $this->page+$i; 
                if($page <= $this->pageNum) 
                    $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> "; 
                else 
                    break; 
            } 
            $linkPage .= '</b>'; 
            return $linkPage; 
        } 
 
        /* 在對象內部使用的私有方法,獲取下一頁和尾頁的操作信息 */ 
        private function nextlast(){ 
            if($this->page != $this->pageNum) { 
                $str = " <a href='{$this->uri}page=".($this->page+1)."'>{$this->config["next"]}</a> "; 
                $str .= " <a href='{$this->uri}page=".($this->pageNum)."'>{$this->config["last"]}</a> "; 
                return $str; 
            } 
        } 
 
        /* 在對象內部使用的私有方法,用於顯示和處理表單跳轉頁面 */ 
        private function goPage(){ 
                if($this->pageNum > 1) { 
                return ' <input style="width:20px;height:17px !important;height:18px;border:1px solid #CCCCCC;" type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'page=\'+page+\'\'}" value="'.$this->page.'"><input style="cursor:pointer;width:25px;height:18px;border:1px solid #CCCCCC;" type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'page=\'+page+\'\'"> '; 
            } 
        } 
 
        /* 在對象內部使用的私有方法,用於獲取本頁顯示的記錄條數 */ 
        private function disnum(){ 
            if($this->total > 0){ 
                return $this->end()-$this->start()+1; 
            }else{ 
                return 0; 
            } 
        } 
    } 
 
     
     
     

<?php
 /**
  file: page.class.php
  完美分頁類 Page
  @微涼 QQ496928838
 */
 class Page {
  private $total;          //數據表中總記錄數
  private $listRows;       //每頁顯示行數
  private $limit;          //SQL語句使用limit從句,限制獲取記錄個數
  private $uri;            //自動獲取url的請求地址
  private $pageNum;        //總頁數
  private $page;       //當前頁 
  private $config = array(
       'head' => "條記錄",
       'prev' => "上一頁",
       'next' => "下一頁",
       'first'=> "首頁",
       'last' => "末頁"
      );       //在分頁信息中顯示內容,可以自己通過set()方法設置
  private $listNum = 10;      //默認分頁列表顯示的個數

  /**
   構造方法,可以設置分頁類的屬性
   @param int $total  計算分頁的總記錄數
   @param int $listRows 可選的,設置每頁需要顯示的記錄數,默認為25條
   @param mixed $query 可選的,為向目標頁面傳遞參數,可以是數組,也可以是查詢字符串格式
   @param  bool $ord 可選的,默認值為true, 頁面從第一頁開始顯示,false則為最後一頁
   */
  public function __construct($total, $listRows=25, $query="", $ord=true){
   $this->total = $total;
   $this->listRows = $listRows;
   $this->uri = $this->getUri($query);
   $this->pageNum = ceil($this->total / $this->listRows);
   /*以下判斷用來設置當前面*/
   if(!empty($_GET["page"])) {
    $page = $_GET["page"];
   }else{
    if($ord)
     $page = 1;
    else
     $page = $this->pageNum;
   }

   if($total > 0) {
    if(preg_match('/\D/', $page) ){
     $this->page = 1;
    }else{
     $this->page = $page;
    }
   }else{
    $this->page = 0;
   }
   
   $this->limit = "LIMIT ".$this->getLimit();
  }

  /**
   用於設置顯示分頁的信息,可以進行連貫操作
   @param string $param 是成員屬性數組config的下標
   @param string $value 用於設置config下標對應的元素值
   @return object   返回本對象自己$this, 用於連慣操作
   */
  function set($param, $value){
   if(array_key_exists($param, $this->config)){
    $this->config[$param] = $value;
   }
   return $this;
  }
  
  /* 不是直接去調用,通過該方法,可以使用在對象外部直接獲取私有成員屬性limit和page的值 */
  function __get($args){
   if($args == "limit" || $args == "page")
    return $this->$args;
   else
    return null;
  }
  
  /**
   按指定的格式輸出分頁
   @param int 0-7的數字分別作為參數,用於自定義輸出分頁結構和調整結構的順序,默認輸出全部結構
   @return string 分頁信息內容
   */
  function fpage(){
   $arr = func_get_args();

   $html[0] = " 共<b> {$this->total} </b>{$this->config["head"]} ";
   $html[1] = " 本頁 <b>".$this->disnum()."</b> 條 ";
   $html[2] = " 本頁從 <b>{$this->start()}-{$this->end()}</b> 條 ";
   $html[3] = " <b>{$this->page}/{$this->pageNum}</b>頁 ";
   $html[4] = $this->firstprev();
   $html[5] = $this->pageList();
   $html[6] = $this->nextlast();
   $html[7] = $this->goPage();

   $fpage = '<div style="font:12px \'\5B8B\4F53\',san-serif;">';
   if(count($arr) < 1)
    $arr = array(0, 1,2,3,4,5,6,7);
    
   for($i = 0; $i < count($arr); $i++)
    $fpage .= $html[$arr[$i]];
  
   $fpage .= '</div>';
   return $fpage;
  }
  
  /* 格式為 1,5,*/
  function getLimit(){
   if($this->page > 0)
    return ($this->page-1)*$this->listRows.", {$this->listRows}";
   else
    return 0;
  }

  /* 在對象內部使用的私有方法,用於自動獲取訪問的當前URL */
  private function getUri($query){ 
   $request_uri = $_SERVER["REQUEST_URI"]; 
   $url = strstr($request_uri,'?') ? $request_uri :  $request_uri.'?';
   
   if(is_array($query))
    $url .= http_build_query($query);
   else if($query != "")
    $url .= "&".trim($query, "?&");
  
   $arr = parse_url($url);

   if(isset($arr["query"])){
    parse_str($arr["query"], $arrs);
    unset($arrs["page"]);
    $url = $arr["path"].'?'.http_build_query($arrs);
   }
   
   if(strstr($url, '?')) {
    if(substr($url, -1)!='?')
     $url = $url.'&';
   }else{
    $url = $url.'?';
   }
   
   return $url;
  }

  /* 在對象內部使用的私有方法,用於獲取當前頁開始的記錄數 */
  private function start(){
   if($this->total == 0)
    return 0;
   else
    return ($this->page-1) * $this->listRows+1;
  }

  /* 在對象內部使用的私有方法,用於獲取當前頁結束的記錄數 */
  private function end(){
   return min($this->page * $this->listRows, $this->total);
  }

  /* 在對象內部使用的私有方法,用於獲取上一頁和首頁的操作信息 */
  private function firstprev(){
   if($this->page > 1) {
    $str = " <a href='{$this->uri}page=1'>{$this->config["first"]}</a> ";
    $str .= "<a href='{$this->uri}page=".($this->page-1)."'>{$this->config["prev"]}</a> ";  
    return $str;
   }

  }
 
  /* 在對象內部使用的私有方法,用於獲取頁數列表信息 */
  private function pageList(){
   $linkPage = " <b>";
   
   $inum = floor($this->listNum/2);
   /*當前頁前面的列表 */
   for($i = $inum; $i >= 1; $i--){
    $page = $this->page-$i;

    if($page >= 1)
     $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> ";
   }
   /*當前頁的信息 */
   if($this->pageNum > 1)
    $linkPage .= "<span style='padding:1px 2px;background:#BBB;color:white'>{$this->page}</span> ";
   
   /*當前頁後面的列表 */
   for($i=1; $i <= $inum; $i++){
    $page = $this->page+$i;
    if($page <= $this->pageNum)
     $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> ";
    else
     break;
   }
   $linkPage .= '</b>';
   return $linkPage;
  }

  /* 在對象內部使用的私有方法,獲取下一頁和尾頁的操作信息 */
  private function nextlast(){
   if($this->page != $this->pageNum) {
    $str = " <a href='{$this->uri}page=".($this->page+1)."'>{$this->config["next"]}</a> ";
    $str .= " <a href='{$this->uri}page=".($this->pageNum)."'>{$this->config["last"]}</a> ";
    return $str;
   }
  }

  /* 在對象內部使用的私有方法,用於顯示和處理表單跳轉頁面 */
  private function goPage(){
       if($this->pageNum > 1) {
    return ' <input style="width:20px;height:17px !important;height:18px;border:1px solid #CCCCCC;" type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'page=\'+page+\'\'}" value="'.$this->page.'"><input style="cursor:pointer;width:25px;height:18px;border:1px solid #CCCCCC;" type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'page=\'+page+\'\'"> ';
   }
  }

  /* 在對象內部使用的私有方法,用於獲取本頁顯示的記錄條數 */
  private function disnum(){
   if($this->total > 0){
    return $this->end()-$this->start()+1;
   }else{
    return 0;
   }
  }
 }

 
 
 
這是一個很強大的分頁類噢.雖然樣子丑了點,不過,可以改造一下哩

mysql.class.php呢我修改了一下 limit方法,使他可以支持一個參數的,和兩個參數的,更方便操作了


[php]  public function limit($offset,$length=null){ 
    if (is_null($length)) { 
        $this->query_list['limit']='limit '.$offset; 
        return $this; 
    }else { 
        if(!isset($length)){ 
            $length = $offset; 
            $offset = 0; 
        } 
            $this->query_list['limit'] = 'limit '.$offset.','.$length; 
            return $this; 
    } 

 public function limit($offset,$length=null){
  if (is_null($length)) {
   $this->query_list['limit']='limit '.$offset;
   return $this;
  }else {
   if(!isset($length)){
    $length = $offset;
    $offset = 0;
   }
    $this->query_list['limit'] = 'limit '.$offset.','.$length;
    return $this;
  }

 

 

還學會了設置時區.


[php] date_default_timezone_set("PRC");            //設置時區(中國 

 date_default_timezone_set("PRC");       //設置時區(中國


修改了 mytpl.class.php 模板引擎,不會造成溢出什麼的了


[php]  <?php 
    /**
        file: mytpl.class.php 類名為MyTpl是自定義的模板引擎
        通過該類對象加載模板文件並解析,將解析後的結果輸出 
        @微涼 QQ496928838
    */ 
    class MyTpl { 
        public $template_dir = 'view';       //定義模板文件存放的目錄    
        public $compile_dir = 'view_c';      //定義通過模板引擎組合後文件存放目錄  
        public $left_delimiter  =  '<{';          //在模板中嵌入動態數據變量的左定界符號  
        public $right_delimiter =  '}>';          //在模板中嵌入動態數據變量的右定界符號  
        private $tpl_vars = array();              //內部使用的臨時變量  
         
        /** 
            將PHP中分配的值會保存到成員屬性$tpl_vars中,用於將板中對應的變量進行替換  
            @param  string  $tpl_var    需要一個字符串參數作為關聯數組下標,要和模板中的變量名對應    
            @param  mixed   $value      需要一個標量類型的值,用來分配給模板中變量的值     
        */ 
        function assign($tpl_var, $value = null) {    
            if ($tpl_var != ''){ 
                $GLOBALS[$tpl_var] = $value; 
                $this->tpl_vars[$tpl_var] = $value; 
                 
            } 
 
 
 
        } 
         
        /** 
            加載指定目錄下的模板文件,並將替換後的內容生成組合文件存放到另一個指定目錄下
            @param  string  $fileName   提供模板文件的文件名                                          
        */ 
         function display($fileName) {  
            /* 到指定的目錄中尋找模板文件 */ 
            $tplFile = $this->template_dir.'/'.$fileName;   
            /* 如果需要處理的模板文件不存在,則退出並報告錯誤 */ 
            if(!file_exists($tplFile)) {                 
                die("模板文件{$tplFile}不存在!"); 
            } 
            /* 獲取組合的模板文件,該文件中的內容都是被替換過的 */ 
            $fileNameMd5 = md5($fileName); 
 
            $comFileName = $this->compile_dir."/com_".$fileNameMd5.'.php';   
                    /* 判斷替換後的文件是否存在或是存在但有改動,都需要重新創建 */ 
            if(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) { 
                /* 調用內部替換模板方法 */ 
                $repContent = $this->tpl_replace(file_get_contents($tplFile));   
                /* 保存由系統組合後的腳本文件 */ 
                file_put_contents($comFileName, $repContent); 
            } 
            /* 包含處理後的模板文件輸出給客戶端 */ 
            include($comFileName);               
        } 
         
        /**  
            內部使用的私有方法,使用正則表達式將模板文件'<{ }>'中的語句替換為對應的值或PHP代碼 
            @param  string  $content    提供從模板文件中讀入的全部內容字符串   
            @return $repContent         返回替換後的字符串
        */ 
        private function tpl_replace($content) { 
            /* 將左右定界符號中,有影響正則的特殊符號轉義  例如,<{ }>轉義\<\{ \}\> */ 
            $left = preg_quote($this->left_delimiter, '/'); 
            $right = preg_quote($this->right_delimiter, '/'); 
 
            /* 匹配模板中各種標識符的正則表達式的模式數組 */ 
            $pattern = array(        
                /* 匹配模板中變量 ,例如,"<{ $var }>"  */ 
                '/'.$left.'\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*'.$right.'/i',      
                /* 匹配模板中if標識符,例如 "<{ if $col == "sex" }> <{ /if }>" */ 
                '/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/ies',  
                /* 匹配elseif標識符, 例如 "<{ elseif $col == "sex" }>" */ 
                '/'.$left.'\s*else\s*if\s*(.+?)\s*'.$right.'/ies',  
                /* 匹配else標識符, 例如 "<{ else }>" */ 
                '/'.$left.'\s*else\s*'.$right.'/is',    
                /* 用來匹配模板中的loop標識符,用來遍歷數組中的值,  例如 "<{ loop $arrs $value }> <{ /loop}>" */ 
                '/'.$left.'\s*loop\s+\$(\S+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*'.$right.'(.+?)'.$left.'\s*\/loop\s*'.$right.'/is', 
                /* 用來遍歷數組中的鍵和值,例如 "<{ loop $arrs $key => $value }> <{ /loop}>"  */ 
                '/'.$left.'\s*loop\s+\$(\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標識符, 例如,'<{ include "header.html" }>' */ 
                '/'.$left.'\s*include\s+[\"\']?(.+?)[\"\']?\s*'.$right.'/ie'                     
            ); 
             
            /* 替換從模板中使用正則表達式匹配到的字符串數組 */ 
            $replacement = array(   
                /* 替換模板中的變量 <?php echo $this->tpl_vars["var"]; */ 
                '<?php echo $this->tpl_vars["${1}"]; ?>',       
                /* 替換模板中的if字符串 <?php if($col == "sex") { ?> <?php } ?> */ 
                '$this->stripvtags(\'<?php if(${1}) { ?>\',\'${2}<?php } ?>\')',      
                /* 替換elseif的字符串 <?php } elseif($col == "sex") { ?> */ 
                '$this->stripvtags(\'<?php } elseif(${1}) { ?>\',"")',   
                /* 替換else的字符串 <?php } else { ?> */ 
                '<?php } else { ?>',    
                /* 以下兩條用來替換模板中的loop標識符為foreach格式 */ 
                '<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"]) { ?>${3}<?php } ?>',   
                '<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"] => $this->tpl_vars["${3}"]) { ?>${4}<?php } ?>',     
                /*替換include的字符串*/ 
                'file_get_contents($this->template_dir."/'.$GLOBALS['className'].'/${1}")' 
                         
            ); 
             
            /* 使用正則替換函數處理 */ 
            $s_content=$content; 
 
            $repContent = preg_replace($pattern, $replacement, $content);    
            /* 如果還有要替換的標識,遞歸調用自己再次替換 */ 
            if(preg_match('/'.$left.'([^('.$right.')]{1,})'.$right.'/', $repContent)) {        
                    if($s_content==$content) { 
                        $repContent = $this->tpl_replace($repContent); 
                    } 
            }  
            /* 返回替換後的字符串 */ 
 
            return $repContent;                                      
        } 
         
         /**
            內部使用的私有方法,用來將條件語句中使用的變量替換為對應的值
            @param  string  $expr       提供模板中條件語句的開始標記           
            @param  string  $statement  提供模板中條件語句的結束標記  
            @return strin               將處理後的條件語句相連後返回  
        */ 
        private function stripvtags($expr, $statement='') { 
            /* 匹配變量的正則 */ 
            $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;                             
        } 
    } 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved