PHP Tokenizer 學習筆記

來源:互聯網
上載者:User

簡介:這是PHP Tokenizer 學習筆記的詳細頁面,介紹了和php,有關的知識、技巧、經驗,和一些php源碼等。

class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=323132' scrolling='no'>

簡述

在某個項目中需要分析 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    echo1 - 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);

即可,返回的字串就是壓縮以後的內容。在這裡還有更多使用 Tokenizer 的執行個體,推薦閱讀。

“PHP Tokenizer 學習筆記”的更多相關文章 》

愛J2EE關注Java邁克爾傑克遜視頻站JSON線上工具

http://biancheng.dnbcw.info/php/323132.html pageNo:16

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.