本文實例講述了PHP遞歸遍歷文件夾去除注釋并壓縮代碼的方法。分享給大家供大家參考,具體如下:
01 | <?php |
02 | // ===================文件夾 遞歸 去除PHP注釋并壓縮========================= |
03 | header( "content-type:text/html;charset=utf-8" ); |
04 | $dir = "D:\sound\admin--" ; // 需要轉換的文件路徑。 |
05 | $fdir = "D:\sound\admin" ; // 最終要放到的位置。 |
06 | $dir = str_replace ( '\\' , '/' , $dir ); |
07 | $fdir = str_replace ( '\\' , '/' , $fdir ); |
08 | if ( $dir == $fdir ){ |
09 | echo "源文件與現在文件路徑沖突,換一個路徑吧" ; |
10 | exit ; |
11 | } |
12 | $arr = array ( $dir , $fdir ); |
13 | ergodic( $dir , $arr ); // 遞歸的時候目錄名一直是改變的。所以用一個數組另外存儲兩個路徑,這樣創建文件或者目錄的時候就可以找到在那個目錄下。 |
14 | md( $fdir ); |
15 | function md( $md ){ // 創建目錄 |
16 | if (! is_dir ( $md ) && ! empty ( $md ) ){ |
17 | mkdir ( $md ,0777); |
18 | } |
19 | } |
20 | // 遞歸 |
21 | function ergodic( $dirname , $arr ){ |
22 | if ( is_dir ( $dirname )){ |
23 | $handle = opendir( $dirname ); |
24 | $a = $arr [1]. substr ( $dirname , strlen ( $arr [0]) ); |
25 | md( $a ); |
26 | while ( $filename = readdir( $handle )){ // 讀取一個打開的文件名。 |
27 | if ( $filename != '.' && $filename != '..' ){ |
28 | $dir = $dirname . '/' . $filename ; // 拼接目錄名 |
29 | if ( is_dir ( $dir )){ |
30 | ergodic( $dir , $arr ); // 遞歸 |
31 | } else { |
32 | file_put_contents ( $a . '/' . $filename ,replace_php_src( $dir ) ); |
33 | echo $dir . " 去注釋壓縮完成!<br>" ; |
34 | } |
35 | } |
36 | } |
37 | } else { |
38 | // 此處無用(因為來的都是目錄),如果只轉換一個文件,就可以這樣使用。 |
39 | file_put_contents ( $arr [1]. '/' . $dirname ,replace_php_src( $arr [0]. '/' . $dirname ) ); |
40 | } |
41 | } |
42 | // 去除注釋并壓縮,heredoc存在的時候去注釋不壓縮。 |
43 | function replace_php_src( $src ){ |
44 | $contents = file_get_contents ( $src ); |
45 | $num = substr_count( $contents , '<<<' ); // heredoc 是否存在。 |
46 | $str = "" ; |
47 | if ( $num > 0){ // heredoc 存在。只去除注釋不壓縮。 |
48 | $file = token_get_all( $contents ); // token_get_all() 將提供的源碼按 PHP 標記進行分割. |
49 | for ( $i =0; $i < count ( $file ); $i ++) { |
50 | if ( is_string ( $file [ $i ]) ){ |
51 | $str .= $file [ $i ]; |
52 | } else { |
53 | $name = token_name( $file [ $i ][0] ); // token_name() 獲取提供的 PHP 解析器代號的符號名稱. |
54 | if ( $name == 'T_COMMENT' || $name == 'T_DOC_COMMENT' ){ // 去除注釋 |
55 | continue ; |
56 | } else { |
57 | $str .= $file [ $i ][1]; |
58 | } |
59 | } |
60 | } |
61 | } else { |
62 | $str = php_strip_whitespace( $src ); // 不存在 heredoc 。因為他會錯誤解析。 |
63 | } |
64 | return $str ; |
65 | } |
希望本文所述對大家PHP程序設計有所幫助。