2009-10-17 83 views
4

我正在写一个快速preg_replace从CSS中去除注释。 CSS评论通常有这种语法:preg_replace出CSS评论?

/* Development Classes*/ 
/* Un-comment me for easy testing 
    (will make it simpler to see errors) */ 

所以我试图杀死一切间/ *和* /,就像这样:

$pattern = "#/\*[^(\*/)]*\*/#"; 
$replace = ""; 
$v = preg_replace($pattern, $replace, $v); 

没有骰子!它似乎在歪斜正斜杠,因为如果我将/ s从模式中删除,我可以将它删除评论文本。我尝试了一些简单的模式,看看我是否可以只输斜线,但他们回到原来的字符串不变:

$pattern = "#/#"; 
$pattern = "/\//"; 

为什么我似乎无法匹配那些斜线任何想法?谢谢!

+1

我不会提供它作为答案,因为它不直接适用于这个问题,但有一些很好的工具可以删除/缩小CSS内容:http://www.minifycss.com/ 只适用于那些可能在这里试图重新发明轮子的人:) – AvatarKava 2009-10-17 15:29:27

+0

你应该更好地使用解析器。否则,您将删除“content:”/ * ... * /“'之类的内容。 – Gumbo 2009-10-17 15:33:56

+0

AvatarKara - 我实际上使用这个脚本: http://code.google.com/p/cssmin/ - 但它并没有因为某些原因删除注释。我认为我必须自己写这一点,但由于其他脚本和答案不起作用,它似乎是一个陌生人正在发生......这是用于EE插件,所以我想知道是否字符串被传入或环境有我不知道的一些怪癖。感谢您的链接! – 2009-10-17 18:16:27

回答

11

这里有一个解决方案:

$regex = array(
"`^([\t\s]+)`ism"=>'', 
"`^\/\*(.+?)\*\/`ism"=>"", 
"`([\n\A;]+)\/\*(.+?)\*\/`ism"=>"$1", 
"`([\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); 

在Samstyle PHP框架

看到脚本/样式表预处理器摘自:http://code.google.com/p/samstyle-php-framework/source/browse/trunk/sp.php

csstest.php:

<?php 

$buffer = file_get_contents('test.css'); 

$regex = array(
"`^([\t\s]+)`ism"=>'', 
"`^\/\*(.+?)\*\/`ism"=>"", 
"`([\n\A;]+)\/\*(.+?)\*\/`ism"=>"$1", 
"`([\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); 
echo $buffer; 

?> 

test.css:

/* testing to remove this */ 
.test{} 

输出csstest.php的:

.test{} 
+0

拿出了一些空格和换行符,但似乎完好无损地留下了所有评论。不过,它绝对看起来像第三行应该删除评论。莫名其妙。 – 2009-10-17 01:07:21

+0

你好,它适用于我 - 完全。评论全部删除。 – mauris 2009-10-17 01:53:08

+0

有趣!感谢您的更新测试。我在ExpressionEngine插件中运行这个,所以我想知道是否有一些环境差异导致我的问题。 – 2009-10-17 17:33:49

5

我不相信你可以使用一个否定的字符类中的分组像你那里。你要使用的是断言,其中有两种类型。 “向前看”和“向后看”。

您在寻找英语的模式基本上是“正斜杠,文字通配符,任何没有跟着正斜杠的字符或任何其他字符通配符,然后是正斜杠或正斜杠不是由文字通配符零次或多次前面,文字外卡,斜线

<?php 

$str = '/* one */ onemore 
/* 
* a 
* b 
**/ 
stuff // single line 
/**/'; 

preg_match_all('#/\*(?:.(?!/)|[^\*](?=/)|(?<!\*)/)*\*/#s', $str, $matches); 
print_r($matches); 

?> 
+0

感谢您的深入解释。我无法让它在我使用它的文件中工作,但它在隔离时完美工作,所以我怀疑我有更多的问题需要弄清楚...... – 2009-10-17 18:10:34

0

只是为了好玩(当然小项目),我做了一个非正则表达式版本这样的代码(我希望它更快):

function removeCommentFromCss($textContent) 
{ 
    $clearText = ""; 
    $charsInCss = strlen($textContent); 
    $searchForStart = true; 
    for($index = 0; $index < $charsInCss; $index++) 
    { 
     if ($searchForStart) 
     { 
      if ($textContent[ $index ] == "/" && (($index + 1) < $charsInCss) && $textContent[ $index + 1 ] == "*") 
      { 
       $searchForStart = false; 
       continue; 
      } 
      else 
      { 
       $clearText .= $textContent[ $index ]; 
      } 
     } 
     else 
     { 
      if ($textContent[ $index ] == "*" && (($index + 1) < $charsInCss) && $textContent[ $index + 1 ] == "/") 
      { 
       $searchForStart = true; 
       $index++; 
       continue; 
      } 
     } 
    } 
    return $clearText; 
}