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

PHP 移除註釋與空白字符:token_get_all 實現原理解析與代碼精簡版

     編輯:PHP 相關知識

PHP 5+ 內建 php_strip_whitespace() 可一鍵移除註釋與空白,但理解其底層原理有助於構建代碼分析、混淆、壓縮工具。本文解析基於 token_get_all() 的手寫實現,展示詞法掃描如何精準過濾 T_COMMENT、T_DOC_COMMENT、T_WHITESPACE 等 Token。

為什麼不用正則?

正則難以處理巢狀結構、Heredoc/Nowdoc、字符串內的類註釋字符。PHP 詞法分析器已將代碼拆解為結構化 Token 陣列,逐 Token 處理才是正統做法。

核心實現:strip_whitespace()

/**
 * 移除代碼中的空白與註釋
 * @param string $content PHP 源代碼
 * @return string 處理後代碼
 */
function strip_whitespace($content) {
    $stripStr = '';
    $tokens   = token_get_all($content);
    $last_space = false;

    for ($i = 0, $j = count($tokens); $i < $j; $i++) {
        if (is_string($tokens[$i])) {
            // 單字符 Token(如 ; { } = 等)直接保留
            $last_space = false;
            $stripStr .= $tokens[$i];
        } else {
            // 陣列 Token:[Token ID, Token 內容, 行號]
            list($id, $text) = $tokens[$i];
            switch ($id) {
                case T_COMMENT:       // // 註釋
                case T_DOC_COMMENT:   // /** 文檔註釋 */
                    // 直接丟棄
                    break;

                case T_WHITESPACE:    // 空白、換行、Tab
                    if (!$last_space) {
                        $stripStr .= ' '; // 壓縮連續空白為單空格
                        $last_space = true;
                    }
                    break;

                case T_START_HEREDOC: // <<< 开始
                    $stripStr .= "<<

Token 類型對照表

常數代表範例
T_COMMENT單行/多行註釋// 註釋、/* 註釋 */
T_DOC_COMMENTPHPDoc 註釋/** 文檔 */
T_WHITESPACE空白字符空格、\t、\n、\r
T_START_HEREDOCHeredoc 開始<<<EOF
T_END_HEREDOCHeredoc 結束EOF;
T_INLINE_HTMLPHP 標籤外內容HTML 文本

測試驗證

<?php
$code = '<?php
// 單行註釋
/** 文檔註釋 */
$var = "hello";  /* 行尾註釋 */
$arr = [1, 2, 3];
?>';

echo strip_whitespace($code);
// 輸出:

進階應用場景

  • 代碼混淆/壓縮:結合變數重命名、常量內聯。
  • 靜態分析:提取類/函數定義、參數列表、依賴關係。
  • 模板引擎預編譯:移除模板中的註釋區塊。
  • 代碼相似度檢測:標準化後比對 Token 序列。

注意事項

  • token_get_all() 在 PHP 8+ 對屬性語法 #[Attr] 支援完善,舊版本可能誤判。
  • Heredoc/Nowdoc 處理需小心跳過內部結構,避免誤刪內容。
  • 保留單空格而非完全移除,防止 echo"a""b"; 這類語法錯誤。
  • 若需保留換行以利除錯,可將 T_WHITESPACE 替換為 \n 而非空格。

掌握 Token 流處理,即掌握了 PHP 代碼結構化操作的鑰匙,是構建開發工具鏈的核心技能。

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