2010-09-29 73 views
3

我發現可以單獨壓縮html,javascript和css文件的工具。然而,可以說我有一個名爲homepage.php的文件,在頁面頂部用php,在頭文件中有css和javascript,在body中有html,還有更多的php代碼,也許還有更多的javascript。有時,與JavaScript塊可能也有它的PHP(用於傳遞PHP值到JavaScript)。有沒有可以處理壓縮這些頁面的工具?用php,javascript,html和css壓縮網頁

瀏覽每個文件,手動將其分開,並單獨壓縮一切可能會非常繁瑣。即使是隻能壓縮文件中的html和css而忽略javascript和php的東西也是非常有用的。無論如何,我的大部分JavaScript都在外部js文件中。

回答

0

感謝所有的反饋人。我將使用apache壓縮這些文件,但希望能夠事先刪除頁面的css和html段中的所有換行符。我無法找到任何可以做到的事情,同時將php和javascript保留在文件中,所以我製作了自己的腳本。

以下代碼絕對可以改進,而且非常非常原始。有很多地方我可以使它更有效率,但這只是一個想法的測試。但是,它的使用效果已經足夠好了。只需將其保存到一個php文件中,並將$ file_name設置爲您的文件的名稱即可。

<? 

function minifyFile($file) 
{ 

    $contents = file_get_contents($file); 

    $contents = preg_replace('/<!--(.|\s)*?-->/', '', $contents); 
    $contents = str_replace('<?', ' <? ', $contents); 
    $contents = str_replace('?>', ' ?> ', $contents); 
    $contents = str_replace('<script', ' <script', $contents); 
    $contents = str_replace('script>', 'script> ', $contents); 

    $filtered = ''; 

    $length = strlen($contents); 

    $ignore = Array(); 
    $html = Array(); 

    for($i = 0;$i <= $length;$i++) 
    { 

     if(substr($contents, $i, 2) == '<?') 
     { 

      $end = strpos($contents, '?>', $i) + 2; 

      array_push($ignore, Array('php', $i, $end)); 
      $i = $end; 

     } 
     else if(strtolower(substr($contents, $i, 7)) == '<script') 
     { 

      $end = strpos($contents, '</script>', $i) + 9; 

      array_push($ignore, Array('js', $i, $end)); 
      $i = $end; 

     } 

    } 

    $ignore_c = count($ignore) - 1; 

    for($i = 0;$i <= $ignore_c;$i++) 
    { 

     $start = $ignore[$i][2]; 

     if($start < $length) 
     { 

      array_push($html, Array('html', $start+1, $ignore[$i+1][1]-1)); 

     } 

    } 

    function cmp($a, $b) 
    { 
    if ($a[1] == $b[1]) { 
     return 0; 
    } 
    return ($a[1] < $b[1]) ? -1 : 1; 
    } 

    $parts = array_merge($ignore, $html); 

    usort($parts, "cmp"); 

    foreach($parts as $k => $v) 
    { 

     $cont = substr($contents, $parts[$k][1], ($parts[$k][2]-$parts[$k][1])); 

     if($parts[$k][0] == 'html') 
     { 

      $cont = str_replace(Array("\n", "\t", " ", " ", " "), " ", $cont); 

     } 

     $filtered .= $cont; 

    } 

    return $filtered; 

} 

$file_name = '../main.php'; 
$filtered = minifyFile($file_name); 

echo '<textarea style="width:700px;height:600px">' . file_get_contents($file_name) . '</textarea>'; 
echo '&nbsp;&nbsp;<textarea style="width:700px;height:600px">' . $filtered . '</textarea>'; 

?> 

有了一些修修補補,這個代碼可以通過修改目錄中的所有文件進行迭代,並將它們保存到另一個目錄作爲精縮版。

2

如果這個問題背後的想法是使用更少的帶寬,那麼我建議你使用apache輸出過濾器(假設你使用Apache作爲web服務器)。只需使用ie過濾所有PHP腳本和靜態HTML頁面即可。 mod_deflate,你會使用更少的帶寬。

0

正常情況下,壓縮html,js和css文件是爲了減少帶寬使用量,因爲這些文件會發送到用戶的瀏覽器,從而加快頁面加載速度。

這是你的用途嗎?你爲什麼要發送PHP到瀏覽器?

如果你的目的不是加快頁面加載速度,但節省磁盤空間,你可以使用gzip或其他東西。但似乎幾乎沒有意義。

+0

我沒有發送PHP到瀏覽器。我希望PHP在文件中保持機智,但要壓縮的html和css部分。我猜縮小是更好的術語......基本上,空格和評論被刪除。我將使用gzip,但我希望儘可能小的文件開始。 – user396404 2010-09-29 15:39:58

+1

@ user396404:理解。實際上,我懷疑這是值得的。我們對js和css進行了縮小,並且相對於獲取頁面的延遲,速度沒有提高(約2%)。如果你只打算在一個頁面(主頁)上做,而你確實打算這樣做,那麼我會用你提到的那種單調乏味的手動方式去做。如果有很多這樣的頁面,請使用@ Gordon的方法。 – LarsH 2010-09-29 21:37:02

1

即使沒有可以讓您一次執行所有微操作的工具,您也可以使用DOM輕鬆自動執行此操作。只需解析頁面,找到所有<script><style>元素。然後通過第三方庫如JsMin或CSSMin運行他們的內容,並用輸出替換節點。

但是,你也可以在你的web服務器上啓用gzip壓縮,這對大多數網站來說應該是足夠的壓縮。還是最近遇到任何流量限制?

+0

你說要在服務器上進行這種轉換,而不是瀏覽器,對吧?任何有關HTML DOM解析工具在服務器上使用的建議? – LarsH 2010-09-29 21:31:44

+0

此外,您提出的方法可能會弄亂他嵌入javascript部分的PHP。除非您只是通過未修改的