preg_replace из комментариев CSS?

Я пишу быстрый preg_replace, чтобы вырезать комментарии из CSS. Комментарии CSS обычно имеют этот синтаксис:

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

Поэтому я пытаюсь убить все между / * и * /, например:

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

Нет кубиков! Кажется, он задыхается от косых черт, потому что я могу заставить его удалить текст комментариев, если я выберу / и из шаблона. Я попробовал несколько более простых шаблонов, чтобы увидеть, могу ли я просто потерять косые черты, но они возвращают исходную строку без изменений:

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

Любые идеи о том, почему я не могу походить на эти косые черты? Благодаря!

Вот решение:

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

Взято из препроцессора сценария / таблицы стилей в платформе PHP Samstyle

См. 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{} 

Я не верю, что вы можете использовать группировку в отрицательном классе символов, как вы там. То, что вы собираетесь использовать, называется Assertions , из которых два типа. «смотреть вперед» и «смотреть сзади».

Образец, который вы ищете на английском языке, в основном: « косой чертой, буквенным шаблоном, чем-либо, за которым не следует косой чертой или чем-либо иным, кроме буквенного шаблона, за которым следует косая черта или косая черта, t, предшествующий буквенным шаблоном, ноль или более раз, буквальная дикая карта, косая черта "

 <?php $str = '/* one */ onemore /* * a * b **/ stuff // single line /**/'; preg_match_all('#/\*(?:.(?!/)|[^\*](?=/)|(?<!\*)/)*\*/#s', $str, $matches); print_r($matches); ?> 

Просто для удовольствия (и, конечно, небольшой проект) я сделал нережизнеспособную версию такого кода (надеюсь, это быстрее):

 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; }