5

preg_replace を使用して複数の CSS ファイルを縮小しようとしています。実際、ファイルから改行/タブとコメントを削除しようとしているだけです。以下は私にとってはうまくいきます:

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

しかし、次のように、単一の複数行の正規表現でそれを行いたいと思います:

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

ただし、これはまったく何もしません。これを行う方法はありますか?


編集:わかりましたので、既存のミニファイアを見ていきますが、このような複数行の正規表現をどのように行うかという疑問が残ります。彼らは?

4

7 に答える 7

11

どうやってそれを行うのかわかりませんが、これは私の友人が書いたスクリプトで、CSS の縮小がかなり高速です。

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;
}
于 2009-09-04T14:04:07.960 に答える
5

必要に応じて、潜在的にバグのある正規表現を保存できるユーティリティが利用可能です。

YUI コンプレッサーは、CSS および JavaScript ファイルの縮小をサポートします。

独自のオプションを作成する前に、このオプションまたは他の既存のオプションを検討することをお勧めします。

于 2009-09-04T13:54:13.183 に答える
2

これは、私が個人的に CSS に使用するものです。

$file_contents = file_get_contents($file);<br />
preg_replace('@({)\s+|(\;)\s+|/\*.+?\*\/|\R@is', '$1$2 ', $file_contents);
于 2011-07-08T20:26:07.067 に答える
1

これは、車輪を再発明してはいけない場合の完璧な例のように思えます。インターネット上のほぼすべてのサイトが CSS を使用しており、大規模なサイトはすべて何らかの方法で CSS を圧縮しています。彼らの方法はすでにテストされ、最適化されています。必要がないのに、なぜ自分で巻くのですか?

マイクとグランボはすでに具体的な提案をしていますが、私は一般的な原則を指摘したかっただけです.

于 2009-09-04T14:08:45.020 に答える
0
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

于 2010-05-13T03:51:16.397 に答える
0

これは私がSamstyle PHP Frameworkで使用しているものです:

$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);

お役に立てれば!

于 2009-09-05T15:06:38.233 に答える
0

私が知る限り、複数の行に分割すると実際にパターンを変更しているため、それはできません。

編集:ええ、車輪を再発明しないための+1。

于 2009-09-04T13:50:01.707 に答える