首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 移除程式碼註解與空白字元的自定義實作

     編輯:PHP 綜合知識

PHP 原始碼壓縮:Tokenizer 深度解析與實作

PHP 5.3+ 內建 php_strip_whitespace() 可移除註解與空白,但理解其底層原理有助於建構程式碼分析工具。本文深入解析使用 token_get_all() 實作自定義原始碼壓縮器的完整邏輯。

核心原理:PHP Tokenizer

token_get_all() 將 PHP 原始碼解析為 Token 陣列,每個 Token 為:

  • 單字元符號 (如 ;, {, $):字串型態
  • 複合 Token:[Token ID, Token 內容, 行號] 陣列

完整實作程式碼

<?php
/**
 * 移除 PHP 原始碼中的註解與多餘空白
 * 
 * @param string $source PHP 原始碼字串
 * @return string 處理後的精簡程式碼
 */
function stripWhitespace($source) {
    $output = '';
    $tokens = token_get_all($source);
    $lastWasWhitespace = false;
    
    for ($i = 0, $count = count($tokens); $i < $count; $i++) {
        $token = $tokens[$i];
        
        // 簡單符號:直接輸出
        if (is_string($token)) {
            $lastWasWhitespace = false;
            $output .= $token;
            continue;
        }
        
        // 複合 Token: [$id, $content, $line]
        list($id, $content) = $token;
        
        switch ($id) {
            // 1. 過濾註解
            case T_COMMENT:        // // 註解、/* 註解 */
            case T_DOC_COMMENT:    // /** 文件註解 */
                // 完全跳過,不輸出任何內容
                break;
                
            // 2. 處理空白字元 (保留單一空格避免語法錯誤)
            case T_WHITESPACE:     // 空格、Tab、換行
                if (!$lastWasWhitespace) {
                    $output .= ' ';  // 壓縮連續空白為單一空格
                    $lastWasWhitespace = true;
                }
                break;
                
            // 3. HEREDOC/NOWDOC 處理
            case T_START_HEREDOC:  // <<< 開始
                $output .= "<< 處理
            case T_CLOSE_TAG:
                $output .= '?>';
                $lastWasWhitespace = false;
                break;
                
            // 5. 其他 Token:輸出內容
            default:
                $lastWasWhitespace = false;
                $output .= $content;
        }
    }
    
    return $output;
}

// 測試範例
$code = '<?php
    // 這是單行註解
    /* 這是多行
       註解 */
    $a = 1;   // 行尾註解
    $b = "hello";
    /** 文件註解 */
    function test() {
        return $a + $b;
    }
?>';

echo stripWhitespace($code);
/*
輸出:

*/
?>

Token 類型完整對照表 (常見)

常數代表範例
T_COMMENT單行/多行註解// comment, /* comment */
T_DOC_COMMENTPHPDoc 註解/** comment */
T_WHITESPACE空白字元空格、Tab、換行
T_VARIABLE變數$var
T_STRING類別/函數/常數名echo, MyClass
T_CONSTANT_ENCAPSED_STRING字串常值'hello', "world"
T_START_HEREDOCHeredoc 開始<<<EOF
T_END_HEREDOCHeredoc 結束EOF;
T_OPEN_TAG開啟標記<?php
T_CLOSE_TAG關閉標記?>

進階應用場景

  1. 程式碼混淆/壓縮:部署前自動處理,減少傳輸體積
  2. 靜態分析工具:提取函數定義、類別結構、相依關係
  3. 程式碼格式化器:配合 Token 重建標準縮排
  4. 安全掃描:偵測 eval, exec 等危險函數調用
  5. 模板引擎預編譯:將模板轉為純 PHP 並壓縮

效能優化建議

  • 快取 Token 化結果:相同檔案重複處理時快取 token_get_all() 結果
  • 串流處理大檔案:使用 token_get_all() 的生成器版本 (PHP 8.0+) 避免記憶體峰值
  • 選擇性保留:生產環境可保留 PHPDoc 供運行時反射使用

內建函數對比

<?php
// 內建函數 (PHP 5.3+)
$stripped = php_strip_whitespace(__FILE__);

// 差異:
// 1. php_strip_whitespace() 直接讀取檔案,不支援字串輸入
// 2. 內建函數保留行號資訊 (錯誤追蹤用)
// 3. 自定義實作可控制保留/移除邏輯 (如保留版權註解)
?>

掌握 Tokenizer 機制不僅能實作程式碼壓縮,更是建構現代 PHP 開發工具鏈 (Linter、Formatter、Analyzer) 的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved