CSS yorum dışarı preg_replace?

2 Cevap php

Ben CSS yorumlarına şerit hızlı preg_replace yazıyorum. CSS yorumları genellikle bu sözdizimi vardır:

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

Yani / * ve * / arasındaki her şeyi öldürmeye çalışıyor, gibi pek ediyorum:

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

Hayır zar! Ben desen dışarı / s almak eğer yorumların metni kaldırmak için olsun, çünkü o, eğik çizgilerle boğulma gibi görünüyor. Ben sadece bölü kaybedebilir olmadığını görmek için bazı basit kalıplarını denedi, ama onlar orijinal dize değişmeden dönmek:

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

Herhangi O bölü maç gibi olamaz neden fikir? Teşekkürler!

2 Cevap

İşte çözüm:

$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 Framework Script / Stil Pre-Processor alınan

Bkz: 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 Çıktı:

.test{}

Ben orada var gibi bir negatif karakter sınıfı içinde gruplandırma kullanabilirsiniz inanmıyorum. Ne kullanmak istediğiniz gidiyoruz iki türü vardır, bunlardan Assertions denir. "Emrini bakmak" ve "bak-arkasında".

İngilizce olarak aradığınız model temelde, "forward slash, literal wildcard, anything that isn't followed by a forward slash or anything other than a literal wildcard that is followed by a forward slash or a forward slash that isn't preceded by a literal wildcard zero or more times, literal wild card, forward slash"

<?php

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

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

?>