日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

PHP Tokenizer 的學(xué)習(xí)筆記_PHP教程

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

推薦:怎樣為Vista/Win08中的IIS7添加PHP支持
目前很多網(wǎng)站采用PHP編寫(xiě),但是,其服務(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%以上的。 下面,就讓我

簡(jiǎn)述

在某個(gè)項(xiàng)目中需要分析 PHP 代碼,分離出對(duì)應(yīng)的函數(shù)調(diào)用(以及源代碼對(duì)應(yīng)的位置)。雖然這使用正則也可以實(shí)現(xiàn),但無(wú)論從效率還是代碼復(fù)雜度方面考慮,這都不是最優(yōu)的方式。

查詢了 PHP 手冊(cè),發(fā)現(xiàn)其實(shí) PHP 已經(jīng)內(nèi)置解析器的接口,那就是 PHP Tokenizer,這工具正是我想要的。使用 PHP Tokenizer 能簡(jiǎn)單、高效、準(zhǔn)確的分析出 PHP 源代碼的組成。

實(shí)例

官方站點(diǎn)對(duì) Tokenizer 的文檔很少,不過(guò)這不影響我們理解它。Tokenizer 組件僅僅包含兩個(gè)函數(shù):token_get_all 以及 token_name,它們分別用于分析 PHP 代碼以及獲取代碼對(duì)應(yīng)的標(biāo)識(shí)符名稱。

下面是個(gè)簡(jiǎn)單的實(shí)例,說(shuō)明如何使用這兩個(gè)函數(shù):

以下為引用的內(nèi)容:

$code = '<?php echo "string1"."string2"; ?>';
$tokens = token_get_all($code);
foreach ($tokens as $token) {
    if (is_array($token)) {
        // 行號(hào)、標(biāo)識(shí)符字面量、對(duì)應(yīng)內(nèi)容
        printf("%d - %s\t%s\n", $token[2], token_name($token[0]), $token[1]);
    }
}

對(duì)應(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    ?>

這里順便說(shuō)明下,$token 如果為數(shù)組,那么分別對(duì)應(yīng)的三個(gè)數(shù)組成員為 token 標(biāo)識(shí)符(可以用 token_name 獲得字面量)、對(duì)應(yīng)的源代碼內(nèi)容、以及對(duì)應(yīng)的行號(hào)。

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

是的,調(diào)用方式非常的簡(jiǎn)單,我們的野心當(dāng)然遠(yuǎn)遠(yuǎn)要比寫(xiě)個(gè)簡(jiǎn)單的循環(huán)要大得多。我們可以利用這個(gè)組件做寫(xiě)實(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);

        // 遞歸判斷每個(gè)標(biāo)記符的類型
        while ($t = current(self::$tokens)) {
            if (is_array($t)) {
                // 過(guò)濾空白、注釋
                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()
    {
        // 增加個(gè)空格,用于分割關(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)用方式很簡(jiǎn)單,只需要使用

以下為引用的內(nèi)容:

CompactCode::compact($source_code);

即可,返回的字符串就是壓縮以后的內(nèi)容。

分享:怎樣用php定制404錯(cuò)誤頁(yè)面 并發(fā)信通知管理員
如果訪問(wèn)您站點(diǎn)的用戶由于各種原因暫時(shí)出現(xiàn)無(wú)法訪問(wèn)頁(yè)面的錯(cuò)誤,如何給他一個(gè)友好的答復(fù),并且你也知道發(fā)生了這個(gè)錯(cuò)誤,看看下面這段程序,是用來(lái)定制404錯(cuò)誤頁(yè)面和發(fā)通知給網(wǎng)管。 以下為引用的內(nèi)容:

來(lái)源:模板無(wú)憂//所屬分類:PHP教程/更新時(shí)間:2009-07-08
相關(guān)PHP教程