7

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 = "/\//";

なぜ私がそれらのスラッシュと一致しないように見えるのかについてのアイデアはありますか?ありがとう!

4

4 に答える 4

14

解決策は次のとおりです。

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

SamstylePHPFrameworkのスクリプト/スタイルシートプリプロセッサから取得

参照: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{}
于 2009-10-17T00:43:38.887 に答える
7

そこにあるように、否定された文字クラス内でグループ化を使用できるとは思いません。使用するものはAssertionsと呼ばれ、2 つのタイプがあります。「先読み」と「後読み」。

英語で探しているパターンは基本的に、「スラッシュ、リテラル ワイルドカード、スラッシュが続かないもの、またはリテラル ワイルドカードの後に​​スラッシュまたはスラッシュが続くもの以外のもの」です。 t の前にリテラル ワイルドカードが 0 回以上続く、リテラル ワイルドカード、スラッシュ"

<?php

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

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

?>
于 2009-10-17T15:26:11.500 に答える