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

原创 2016年10月16日 11:07:00

php_strip_whitespace函数:

php_strip_whitespace(string $filename)

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

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

<?php
function 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;
}
?>

PHP 函数的完整参考手册

所有 PHP 函数的完整参考手册: Array 函数 Calendar 函数 cURL 函数 Date 函数 Directory 函数 Error 函数 Filesystem 函数 Filter ...
  • Fancie_Wong
  • Fancie_Wong
  • 2016年11月02日 13:50
  • 1497

PHP解压缩文件函数详解

zclose: 关闭压缩文件。 gzeof: 判断是否在压缩文件尾。 gzfile: 读压缩文件到数组中。 gzgetc: 读压缩文件中的字符。 gzgets: 读压缩文件中的字符串。 gzg...
  • wuchengzeng
  • wuchengzeng
  • 2014年06月09日 16:54
  • 1621

PHP常用函数归类总结【大全】

用函数归类总结, 学习了这么就PHP,基础知识总感觉不牢靠,尤其是数组,字符串函数的应用,抽了个时间总结了一下,已做日后备查。 一。PHP基础语法 变量,常量     严格区分大小写,但内置结...
  • ty_hf
  • ty_hf
  • 2015年11月04日 18:57
  • 7876

将字符串中的单词翻转,不能使用php提供的任何函数 strlen 除外

将字符串中的单词翻转,不能使用php提供的任何函数 strlen 除外 题目: 写一个函数将字符串中的单词翻转,不能使用php提供的任何函数 strlen 除外。 单词的定义是...
  • sinat_36329815
  • sinat_36329815
  • 2017年06月03日 18:10
  • 585

PHP回调函数的实现方法

全局回调函数:     这里的全局函数的意思,是直接使用function定义的函数,它不包含在任何对象或类之中。请看下面的例子。 示例代码: function fnCallBack( $...
  • markely
  • markely
  • 2014年04月14日 21:30
  • 2113

php 字符串压缩

gzcompress gzencode gzdeflate bzcompressgzcompress gzdeflate gzencode函数的区别在于它们压缩的数据格式不同:gzcom...
  • u013372487
  • u013372487
  • 2017年06月08日 20:38
  • 339

请遵守好的编程风格 -- 关于.h文件去写函数的具体实现

今天往工程里添加Log.h和Log.cpp这用来打印log的文件时, 编译报错误.  Log.cpp里的一些函数调用func1(), func2(), funcXXX()找不到实现, 可是那些函数明...
  • aa2650
  • aa2650
  • 2014年05月23日 16:21
  • 3087

MATLAB函数速查手册

MATLAB函数速查手册
  • u010510134
  • u010510134
  • 2016年03月19日 17:29
  • 1725

PHP如何给网站开启压缩输出增强网站访问速度

分享两种压缩页面输出数据以提高网页访问速度的方法,一种是通过使用php zlib扩展实现页面gzip压缩输出(使用php的内置函数ob_gzhandler进行gzip压缩输出),另外一种方法是是通过修...
  • forest_fire
  • forest_fire
  • 2016年03月21日 11:17
  • 429

宏的妙用以及与函数的比较

宏所进行的是一个完全的文本替换工作,它的声明方式如下: #define name(parameter-list) stuff 首先,name为命名的一个符号,stuff为替换文本,paramete...
  • hulifangjiayou
  • hulifangjiayou
  • 2015年03月06日 15:00
  • 808
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP的php_strip_whitespace函数描述,以及手册中写的代码压缩函数-可看看函数是怎么实现的
举报原因:
原因补充:

(最多只允许输入30个字)