PHP Tokenizer 的學習筆記_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:怎樣為Vista/Win08中的IIS7添加PHP支持
      目前很多網站采用PHP編寫,但是,其服務器環境可不一定是FreeBSD、Linux,很多PHP的網站都是運行在Windows2000、Windows2003和Windows Server 2008系統上。而且,根據之前諸多的消息顯示,Windows Server 2008中運行PHP的效率提高了40%以上的。 下面,就讓我

      簡述

      在某個項目中需要分析 PHP 代碼,分離出對應的函數調用(以及源代碼對應的位置)。雖然這使用正則也可以實現,但無論從效率還是代碼復雜度方面考慮,這都不是最優的方式。

      查詢了 PHP 手冊,發現其實 PHP 已經內置解析器的接口,那就是 PHP Tokenizer,這工具正是我想要的。使用 PHP Tokenizer 能簡單、高效、準確的分析出 PHP 源代碼的組成。

      實例

      官方站點對 Tokenizer 的文檔很少,不過這不影響我們理解它。Tokenizer 組件僅僅包含兩個函數:token_get_all 以及 token_name,它們分別用于分析 PHP 代碼以及獲取代碼對應的標識符名稱。

      下面是個簡單的實例,說明如何使用這兩個函數:

      以下為引用的內容:

      $code = '<?php echo "string1"."string2"; ?>';
      $tokens = token_get_all($code);
      foreach ($tokens as $token) {
          if (is_array($token)) {
              // 行號、標識符字面量、對應內容
              printf("%d - %s\t%s\n", $token[2], token_name($token[0]), $token[1]);
          }
      }

      對應的輸出為

      以下為引用的內容:

      1 - T_OPEN_TAG    <?php 
      1 - T_ECHO    echo
      1 - T_WHITESPACE     
      1 - T_CONSTANT_ENCAPSED_STRING    "string1"
      1 - T_CONSTANT_ENCAPSED_STRING    "string2"
      1 - T_WHITESPACE     
      1 - T_CLOSE_TAG    ?>

      這里順便說明下,$token 如果為數組,那么分別對應的三個數組成員為 token 標識符(可以用 token_name 獲得字面量)、對應的源代碼內容、以及對應的行號。

      還有中情況就是 $token 為字符串,這可能的情況之一就是為 T_CONSTANT_ENCAPSED_STRING 等常量,在分析代碼時要注意。如果對這點很在意,可以考慮使用這里的代碼。

      是的,調用方式非常的簡單,我們的野心當然遠遠要比寫個簡單的循環要大得多。我們可以利用這個組件做寫實事,例如下面的代碼用于“壓縮” PHP 代碼,去除不不要的換行、空白以及注釋

      以下為引用的內容:

      /**
       * “壓縮”PHP 源代碼
       *
       * @see http://c7y.phparch.com/c/entry/1/art,practical_uses_tokenizer
       */
      class CompactCode
      {
          static protected $out;
          static protected $tokens;
      
          static public function compact($source)
          {
              // 解析 PHP 源代碼
              self::$tokens = token_get_all($source);   
              self::$out = '';
      
              reset(self::$tokens);
      
              // 遞歸判斷每個標記符的類型
              while ($t = current(self::$tokens)) {
                  if (is_array($t)) {
                      // 過濾空白、注釋
                      if ($t[0] == T_WHITESPACE || $t[0] == T_DOC_COMMENT || $t[0] == T_COMMENT) {
                          self::skipWhiteAndComments();
                          continue;
                      }       
                      self::$out .= $t[1];
                  } else {
                      self::$out .= $t;
                  }
      
                  next(self::$tokens);
              }
      
              return self::$out;
          }
      
          static private function skipWhiteAndComments()
          {
              // 增加個空格,用于分割關鍵字
              self::$out .= ' ';
              while ($t = current(self::$tokens)) {
                  // 再次貪婪查找
                  if (is_array($t) && ($t[0] == T_WHITESPACE || $t[0] == T_DOC_COMMENT || $t[0] == T_COMMENT)) {
                      next(self::$tokens);
                  } else {
                      return;
                  }
              }
          }
      }

      調用方式很簡單,只需要使用

      以下為引用的內容:

      CompactCode::compact($source_code);

      即可,返回的字符串就是壓縮以后的內容。

      分享:怎樣用php定制404錯誤頁面 并發信通知管理員
      如果訪問您站點的用戶由于各種原因暫時出現無法訪問頁面的錯誤,如何給他一個友好的答復,并且你也知道發生了這個錯誤,看看下面這段程序,是用來定制404錯誤頁面和發通知給網管。 以下為引用的內容:

      來源:模板無憂//所屬分類:PHP教程/更新時間:2009-07-08
      相關PHP教程