PHP的php_strip_whitespace函数描述,以及手册中写的代码压缩函数-可看看函数是怎么实现的

来源:互联网 发布:李炎恢 javascript视频 编辑:程序博客网 时间:2024/04/29 10:55

php_strip_whitespace函数:

php_strip_whitespace(string $filename)

    1.返回删除注释和空格后 filename 的PHP源码(想要减少文件大小,我们可以使用此函数)
    2.这对实际代码数量和注释数量的对比很有用,一般文件中的注释就占了很大比重,尤其是一些框架,都有自己的版权,一大堆,可麻烦了
    3.在命令行上,执行 "php -w",与调用此函数的效果类似
    4.$filename - 要删除注释和空格的文件路径
    5.返回值:成功时,返回过滤后的代码,失败返回 ""-空字符串

该函数使用还是想对简单的,我们这里主要是摘录下手册里记录的一个评论,压缩php源码(再次说明下:我这里仅记录,也未对源码进行分析,是为了用到的时候,可以记忆起来):

<?phpfunction compress_php_src($src) {    // Whitespaces left and right from this signs can be ignored    static $IW = array(        T_CONCAT_EQUAL,             // .=        T_DOUBLE_ARROW,             // =>        T_BOOLEAN_AND,              // &&        T_BOOLEAN_OR,               // ||        T_IS_EQUAL,                 // ==        T_IS_NOT_EQUAL,             // != or <>        T_IS_SMALLER_OR_EQUAL,      // <=        T_IS_GREATER_OR_EQUAL,      // >=        T_INC,                      // ++        T_DEC,                      // --        T_PLUS_EQUAL,               // +=        T_MINUS_EQUAL,              // -=        T_MUL_EQUAL,                // *=        T_DIV_EQUAL,                // /=        T_IS_IDENTICAL,             // ===        T_IS_NOT_IDENTICAL,         // !==        T_DOUBLE_COLON,             // ::        T_PAAMAYIM_NEKUDOTAYIM,     // ::        T_OBJECT_OPERATOR,          // ->        T_DOLLAR_OPEN_CURLY_BRACES, // ${        T_AND_EQUAL,                // &=        T_MOD_EQUAL,                // %=        T_XOR_EQUAL,                // ^=        T_OR_EQUAL,                 // |=        T_SL,                       // <<        T_SR,                       // >>        T_SL_EQUAL,                 // <<=        T_SR_EQUAL,                 // >>=    );    if(is_file($src)) {        if(!$src = file_get_contents($src)) {            return false;        }    }    $tokens = token_get_all($src);        $new = "";    $c = sizeof($tokens);    $iw = false; // ignore whitespace    $ih = false; // in HEREDOC    $ls = "";    // last sign    $ot = null;  // open tag    for($i = 0; $i < $c; $i++) {        $token = $tokens[$i];        if(is_array($token)) {            list($tn, $ts) = $token; // tokens: number, string, line            $tname = token_name($tn);            if($tn == T_INLINE_HTML) {                $new .= $ts;                $iw = false;            } else {                if($tn == T_OPEN_TAG) {                    if(strpos($ts, " ") || strpos($ts, "\n") || strpos($ts, "\t") || strpos($ts, "\r")) {                        $ts = rtrim($ts);                    }                    $ts .= " ";                    $new .= $ts;                    $ot = T_OPEN_TAG;                    $iw = true;                } elseif($tn == T_OPEN_TAG_WITH_ECHO) {                    $new .= $ts;                    $ot = T_OPEN_TAG_WITH_ECHO;                    $iw = true;                } elseif($tn == T_CLOSE_TAG) {                    if($ot == T_OPEN_TAG_WITH_ECHO) {                        $new = rtrim($new, "; ");                    } else {                        $ts = " ".$ts;                    }                    $new .= $ts;                    $ot = null;                    $iw = false;                } elseif(in_array($tn, $IW)) {                    $new .= $ts;                    $iw = true;                } elseif($tn == T_CONSTANT_ENCAPSED_STRING                       || $tn == T_ENCAPSED_AND_WHITESPACE)                {                    if($ts[0] == '"') {                        $ts = addcslashes($ts, "\n\t\r");                    }                    $new .= $ts;                    $iw = true;                } elseif($tn == T_WHITESPACE) {                    $nt = @$tokens[$i+1];                    if(!$iw && (!is_string($nt) || $nt == '$') && !in_array($nt[0], $IW)) {                        $new .= " ";                    }                    $iw = false;                } elseif($tn == T_START_HEREDOC) {                    $new .= "<<<S\n";                    $iw = false;                    $ih = true; // in HEREDOC                } elseif($tn == T_END_HEREDOC) {                    $new .= "S;";                    $iw = true;                    $ih = false; // in HEREDOC                    for($j = $i+1; $j < $c; $j++) {                        if(is_string($tokens[$j]) && $tokens[$j] == ";") {                            $i = $j;                            break;                        } else if($tokens[$j][0] == T_CLOSE_TAG) {                            break;                        }                    }                } elseif($tn == T_COMMENT || $tn == T_DOC_COMMENT) {                    $iw = true;                } else {                    if(!$ih) {                        $ts = strtolower($ts);                    }                    $new .= $ts;                    $iw = false;                }            }            $ls = "";        } else {            if(($token != ";" && $token != ":") || $ls != $token) {                $new .= $token;                $ls = $token;            }            $iw = true;        }    }    return $new;}?>

0 0
原创粉丝点击