PHP Tokenizer 的學(xué)習(xí)筆記_PHP教程
推薦:怎樣為Vista/Win08中的IIS7添加PHP支持目前很多網(wǎng)站采用PHP編寫,但是,其服務(wù)器環(huán)境可不一定是FreeBSD、Linux,很多PHP的網(wǎng)站都是運(yùn)行在Windows2000、Windows2003和Windows Server 2008系統(tǒng)上。而且,根據(jù)之前諸多的消息顯示,Windows Server 2008中運(yùn)行PHP的效率提高了40%以上的。 下面,就讓我
簡述
在某個項(xiàng)目中需要分析 PHP 代碼,分離出對應(yīng)的函數(shù)調(diào)用(以及源代碼對應(yīng)的位置)。雖然這使用正則也可以實(shí)現(xiàn),但無論從效率還是代碼復(fù)雜度方面考慮,這都不是最優(yōu)的方式。
查詢了 PHP 手冊,發(fā)現(xiàn)其實(shí) PHP 已經(jīng)內(nèi)置解析器的接口,那就是 PHP Tokenizer,這工具正是我想要的。使用 PHP Tokenizer 能簡單、高效、準(zhǔn)確的分析出 PHP 源代碼的組成。
實(shí)例
官方站點(diǎn)對 Tokenizer 的文檔很少,不過這不影響我們理解它。Tokenizer 組件僅僅包含兩個函數(shù):token_get_all 以及 token_name,它們分別用于分析 PHP 代碼以及獲取代碼對應(yīng)的標(biāo)識符名稱。
下面是個簡單的實(shí)例,說明如何使用這兩個函數(shù):
以下為引用的內(nèi)容: $code = '<?php echo "string1"."string2"; ?>'; $tokens = token_get_all($code); foreach ($tokens as $token) { if (is_array($token)) { // 行號、標(biāo)識符字面量、對應(yīng)內(nèi)容 printf("%d - %s\t%s\n", $token[2], token_name($token[0]), $token[1]); } } |
對應(yīng)的輸出為
以下為引用的內(nèi)容: 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 如果為數(shù)組,那么分別對應(yīng)的三個數(shù)組成員為 token 標(biāo)識符(可以用 token_name 獲得字面量)、對應(yīng)的源代碼內(nèi)容、以及對應(yīng)的行號。
還有中情況就是 $token 為字符串,這可能的情況之一就是為 T_CONSTANT_ENCAPSED_STRING 等常量,在分析代碼時要注意。如果對這點(diǎn)很在意,可以考慮使用這里的代碼。
是的,調(diào)用方式非常的簡單,我們的野心當(dāng)然遠(yuǎn)遠(yuǎn)要比寫個簡單的循環(huán)要大得多。我們可以利用這個組件做寫實(shí)事,例如下面的代碼用于“壓縮” PHP 代碼,去除不不要的換行、空白以及注釋
以下為引用的內(nèi)容: /** * “壓縮”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); // 遞歸判斷每個標(biāo)記符的類型 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() { // 增加個空格,用于分割關(guān)鍵字 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; } } } } |
調(diào)用方式很簡單,只需要使用
以下為引用的內(nèi)容: CompactCode::compact($source_code); |
即可,返回的字符串就是壓縮以后的內(nèi)容。
分享:怎樣用php定制404錯誤頁面 并發(fā)信通知管理員如果訪問您站點(diǎn)的用戶由于各種原因暫時出現(xiàn)無法訪問頁面的錯誤,如何給他一個友好的答復(fù),并且你也知道發(fā)生了這個錯誤,看看下面這段程序,是用來定制404錯誤頁面和發(fā)通知給網(wǎng)管。 以下為引用的內(nèi)容:
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時間
- PHP中獎概率的抽獎算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-PHP Tokenizer 的學(xué)習(xí)筆記。