Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493921
  • 博文数量: 51
  • 博客积分: 257
  • 博客等级: 二等列兵
  • 技术积分: 1489
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-02 18:30
个人简介

Unix/Linux, mysql, web,企业应用

文章分类

全部博文(51)

文章存档

2015年(1)

2014年(1)

2013年(48)

2012年(1)

我的朋友

分类: PHP

2013-03-20 22:55:52

更新:可以直接使用PHP的内置函数 php_strip_whitespace(string $filename) 来去掉PHP源代码中的空白和注释,不用这么费劲,文档地址:

如何去除PHP代码中的空白和注释?且看以下代码。
主要函数(摘自ThinkPHP):
  1. /**
  2.  * 去除代码中的空白和注释
  3.  * @param string $content 代码内容
  4.  * @return string
  5.  */
  6. function strip_whitespace($content) {
  7.     $stripStr = '';
  8.     //分析php源码
  9.     $tokens = token_get_all($content);
  10.     $last_space = false;
  11.     for ($i = 0, $j = count($tokens); $i < $j; $i++) {
  12.         if (is_string($tokens[$i])) {
  13.             $last_space = false;
  14.             $stripStr .= $tokens[$i];
  15.         } else {
  16.             switch ($tokens[$i][0]) {
  17.                 //过滤各种PHP注释
  18.                 case T_COMMENT:
  19.                 case T_DOC_COMMENT:
  20.                     break;
  21.                 //过滤空格
  22.                 case T_WHITESPACE:
  23.                     if (!$last_space) {
  24.                         $stripStr .= ' ';
  25.                         $last_space = true;
  26.                     }
  27.                     break;
  28.                 case T_START_HEREDOC:
  29.                     $stripStr .= "<<;
  30.                     break;
  31.                 case T_END_HEREDOC:
  32.                     $stripStr .= "THINK;\n";
  33.                     for($k = $i+1; $k < $j; $k++) {
  34.                         if(is_string($tokens[$k]) && $tokens[$k] == ';') {
  35.                             $i = $k;
  36.                             break;
  37.                         } else if($tokens[$k][0] == T_CLOSE_TAG) {
  38.                             break;
  39.                         }
  40.                     }
  41.                     break;
  42.                 default:
  43.                     $last_space = false;
  44.                     $stripStr .= $tokens[$i][1];
  45.             }
  46.         }
  47.     }
  48.     return $stripStr;
  49. }
用于压缩测试的代码文件(fuckcpu.php):
  1. <?php
  2. function doCal(){
  3.         $t=8292*23432*234343*29293829*234343234;
  4.         $tt=$t*2343*2343/2343*34324;
  5. }
  6. while(true){
  7.         doCal();
  8. }
  9. ?>
测试脚本(test.php):
  1. <?php
  2. require('common.php');
  3. $phpFile='fuckcpu.php';
  4. echo strip_whitespace(file_get_contents($phpFile));
  5. ?>
fuckcpu.php 被压缩之后的输出:
  1. <?php
  2. function doCal(){ $t=8292*23432*234343*29293829*234343234; $tt=$t*2343*2343/2343*34324; } while(true){ doCal(); } ?>

说明:
strip_whitespace($content) 函数中主要用到了PHP的自带函数 token_get_all($source) ,这个函数的作用就是用Zend引擎的词典扫描器把PHP源代码解析成一个个PHP语言token。
token_get_all() 函数的返回值是一个token标识符数组,这个数组中的元素要么是单个字符(如:),要么是一个包含三个元素的数组,第一个元素保存了这个token的代号,第二个元素保存了这个token的字符串内容,第三个元素保存了这个token所在的行号。参考:

阅读(3075) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~