Minify CSS preg_replace kullanarak

7 Cevap php

Ben preg_replace kullanarak birden fazla CSS dosyaları küçültmek için çalışıyorum. Aslında, sadece dosyadan herhangi linebreaks / sekmeler ve yorumları kaldırmak için çalışıyorum. Benim için aşağıdaki işler:

$regex = array('{\t|\r|\n}', '{(/\*(.*?)\*/)}');
echo preg_replace($regex, '', file_get_contents($file));

Ama bu böyle, bir tek satırlı regex bunu yapmak istiyorum:

$regex = <<<EOF
{(
    \t
|
    \r
|
    \n
|
    /\*(.*?)\*/
)}x
EOF;
echo preg_replace($regex, '', file_get_contents($file));

Ancak, bu hiçbir şey yapmaz. Bunu yapmak için herhangi bir yolu var mı?


Edit: Tamam, bu yüzden mevcut minifiers bir göz atacağız, ama x-değiştirici satırlı regexs bile düzgün çalışması gerekir çünkü hala ben, böyle bir satırlı regex yapacağını nasıl soru ile beni bırakır php, onlar değil mi?

7 Cevap

Ihtiyaçlarınıza uygun ve size bir potansiyel adamcağız regex kaydedebilirsiniz mevcuttur yarar vardır.

YUI compressor CSS ve javascript dosyaları minification destekler.

Kendi yazmadan önce bu ya da diğer mevcut seçenekler düşünebilirsiniz.

Ben bunu nasıl emin değilim, ama burada arkadaşım o minifying CSS oldukça hızlı yazdığım bir script:

function minimize_css($input)
{
    // Remove comments
    $output = preg_replace('#/\*.*?\*/#s', '', $input);
    // Remove whitespace
    $output = preg_replace('/\s*([{}|:;,])\s+/', '$1', $output);
    // Remove trailing whitespace at the start
    $output = preg_replace('/\s\s+(.*)/', '$1', $output);
    // Remove unnecesairy ;'s
    $output = str_replace(';}', '}', $output);
    return $output;
}

Bu benim kişisel CSS için ne kullanın:

$file_contents = file_get_contents($file);<br />
preg_replace('@({)\s+|(\;)\s+|/\*.+?\*\/|\R@is', '$1$2 ', $file_contents);

Bu not tekerleği yeniden icat etmek zaman mükemmel bir örnek gibi görünüyor. Internette neredeyse her site CSS kullanır ve tüm büyük olanlar her nasılsa onu sıkıştırma. Onların yöntemleri zaten test ve optimize edilmiştir. Sen yoksa Neden kendi rulo?

Mike ve Grumbo zaten belirli öneri verdik, ama ben sadece genel ilkeyi işaret etmek istedim.

Eğer birden fazla satır girmeye zaman aslında deseni değişiyor çünkü bildiğim kadarıyla bunu yapamam.

Edit: ve evet, tekerleği yeniden icat değil +1.

Bu i Samstyle PHP Framework olarak kullanıyorum budur:

$regex = array(
"`^([\t\s]+)`ism"=>'',
"`([:;}{]{1})([\t\s]+)(\S)`ism"=>'$1$3',
"`(\S)([\t\s]+)([:;}{]{1})`ism"=>'$1$3',
"`\/\*(.+?)\*\/`ism"=>"",
"`([\n|\A|;]+)\s//(.+?)[\n\r]`ism"=>"$1\n",
"`(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+`ism"=>"\n"
);
$buffer = preg_replace(array_keys($regex),$regex,$buffer);

Bu yardımcı olur umarım!

function minifyCSS($css){
    $css = trim($css);
    $css = str_replace("\r\n", "\n", $css);
    $search = array("/\/\*[^!][\d\D]*?\*\/|\t+/","/\s+/", "/\}\s+/");
    $replace = array(null," ", "}\n");
    $css = preg_replace($search, $replace, $css);
    $search = array("/;[\s+]/","/[\s+];/","/\s+\{\\s+/", "/\\:\s+\\#/", "/,\s+/i", "/\\:\s+\\\'/i","/\\:\s+([0-9]+|[A-F]+)/i","/\{\\s+/","/;}/");
    $replace = array(";",";","{", ":#", ",", ":\'", ":$1","{","}");
    $css = preg_replace($search, $replace, $css);
    $css = str_replace("\n", null, $css);
    return $css;    

}


http://mhameen.blogspot.com/2010/04/crystal-script-manger-for-php.html#links