我正在尝试使用 preg_replace 缩小多个 CSS 文件。实际上,我只是想从文件中删除任何换行符/制表符和注释。以下对我有用:
$正则表达式 = 数组('{| | }', '{(/\*(.*?)\*/)}'); 回声 preg_replace($regex, '', file_get_contents($file));
但我想在单个多行正则表达式中执行此操作,如下所示:
$正则表达式=<<但是,这根本没有任何作用。有什么办法可以做到这一点吗?
编辑:好的,所以我会看看现有的缩小器,但它仍然给我留下了一个问题,我将如何做这样的多行正则表达式,因为使用 x 修饰符多行正则表达式即使在 php 中也应该可以正常工作,不是吗?
我不确定你会如何做到这一点,但这是我朋友写的一个脚本,它可以非常快地缩小 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; }
有一些可用的实用程序可能会满足您的需求,并为您节省可能存在错误的正则表达式。
YUI 压缩器支持缩小 CSS 和 javascript 文件。
在编写自己的选项之前,您可能希望考虑此选项或其他现有选项。
这是我个人使用的CSS:
$file_contents = file_get_contents($file);<br /> preg_replace('@({)\s+|(\;)\s+|/\*.+?\*\/|\R@is', '$1$2 ', $file_contents);
这似乎是何时不重新发明轮子的完美例子。互联网上几乎每个网站都使用 CSS,并且所有大型网站都以某种方式对其进行压缩。他们的方法已经过测试和优化。如果没有必要,为什么要自己推出呢?
Mike和Grumbo已经给出了具体的建议,但我只是想指出一般原则。
据我所知你不能这样做,因为当你将它分成多行时,你实际上是在改变模式。
编辑:是的,+1,因为没有重新发明轮子。
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
这就是我在 Samstyle PHP 框架中使用的:
$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);
希望这有帮助!
我不确定你会如何做到这一点,但这是我朋友写的一个脚本,它可以非常快地缩小 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;
}
有一些可用的实用程序可能会满足您的需求,并为您节省可能存在错误的正则表达式。
YUI 压缩器支持缩小 CSS 和 javascript 文件。
在编写自己的选项之前,您可能希望考虑此选项或其他现有选项。
这是我个人使用的CSS:
$file_contents = file_get_contents($file);<br />
preg_replace('@({)\s+|(\;)\s+|/\*.+?\*\/|\R@is', '$1$2 ', $file_contents);
这似乎是何时不重新发明轮子的完美例子。互联网上几乎每个网站都使用 CSS,并且所有大型网站都以某种方式对其进行压缩。他们的方法已经过测试和优化。如果没有必要,为什么要自己推出呢?
Mike和Grumbo已经给出了具体的建议,但我只是想指出一般原则。
据我所知你不能这样做,因为当你将它分成多行时,你实际上是在改变模式。
编辑:是的,+1,因为没有重新发明轮子。
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
这就是我在 Samstyle PHP 框架中使用的:
$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);
希望这有帮助!