0

我有的

我在 php 中有以下正则表达式,可以缩小原始 css 字符串:

function compress( $css ) {
    $css = str_replace('; ',';', $css);
    $css = str_replace(': ',':', $css);
    $css = str_replace(', ',',', $css);

    $css = str_replace(' }','}', $css);
    $css = str_replace('} ','}', $css);

    $css = str_replace('{ ','{', $css);
    $css = str_replace(' {','{', $css);

    $css = str_replace('( ','(', $css);
    $css = str_replace(' (','(', $css);

    $css = str_replace(' )',')', $css);
    $css = str_replace(') ',')', $css);

    $css = str_replace(array("\r\n","\r","\n","\t",'  ','    ','    '),"",preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!','',$css));

    return $css;
}

这有效,但代码很糟糕。

问题

有人知道写这个的更好方法吗?

4

3 回答 3

6

我已经经历了很多次,目前我有一个运行良好的实现。

// comments
$string = preg_replace('!/\*.*?\*/!s','', $string);
$string = preg_replace('/\n\s*\n/',"\n", $string);

// space
$string = preg_replace('/[\n\r \t]/',' ', $string);
$string = preg_replace('/ +/',' ', $string);
$string = preg_replace('/ ?([,:;{}]) ?/','$1',$string);

// trailing;
$string = preg_replace('/;}/','}',$string);

我将此实现为 Twig 过滤器:https ://github.com/catchamonkey/CatchamonkeyAsseticFilterBundle

于 2013-03-14T13:59:14.267 回答
2

如何更改此代码:

...
$css = str_replace('; ',';', $css);
$css = str_replace(': ',':', $css);
$css = str_replace(', ',',', $css);

$css = str_replace(' }','}', $css);
$css = str_replace('} ','}', $css);

$css = str_replace('{ ','{', $css);
$css = str_replace(' {','{', $css);
...

对此:

$css = str_replace(array('; ',': ',', ',...),array(';',':',',',...),$css);

还可以考虑使用现有的库进行 CSS 缩小。有很多东西可以缩小。例如:margin:0 0 0 0;可以变成margin:0;等等……

于 2013-03-14T13:58:28.910 回答
1

我将它用于css:

//Minify CSS code:
function minifyCSS($sCss) {
    // Compress whitespace.
    $sCss = preg_replace('/\s+/', ' ', $sCss);
    // Remove comments.
    $sCss = preg_replace('/\/\*.*?\*\//', '', $sCss);

    return trim($sCss);
}
于 2013-03-14T13:58:48.767 回答