Я пишу быстрый 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; }