Hiçbir içeriğe sahip bir CSS dosyasındaki sınıfları / kimlikleri tespit Düzenli İfade

3 Cevap php

Ben bizim sistemlerinde bazı eski CSS dosyaları güncelleyerek sürecinde kulüpler ve biz sadece dosyada yer kaplıyor boş sınıfların çok var bir sürü var. Ben Düzenli ifadeler yazmayı öğrenmek isterdim, ama ben sadece onları alamadım. Ben (biraz daha tutarlı açıklama ile) onlara kendimi maruz fazla umut ediyorum, daha ben onları anlama bitireceğiz.

The Problem

O dedi, ben takip metin tespit edecek bir ifade için arıyorum bir '{' (bazı arasında boşluk var, ve bazı yapmak değil) ve braket arasında hiçbir harf veya rakam varsa '}' (boşluk don 't) saymak, eşleşen bir dize olarak tespit edilecektir.

Ben bunun üzerinden bir düzenli ifadeyi çalıştırmadan önce ben doc dışında boşluk trim varsayalım, ama metnin temel yapısını değiştirmek istemiyorum. Ben büyük bir <textarea> içine dönmek için umuyorum.

Ayrıca karakterler ve anlamları, ve de, herhangi bir metin veya sayılar olmadan kopya satırları tanımlayan bir ifade açıklamak için bonus puan. Ben büyük olasılıkla PHP komut dosyası nihai ifadesini kullanır.

tl; dr:

Düzenli İfade maç:

.a_class_or #an_id {
    /* if there aren't any alphanumerics in here, 
       this should be a matching line of text */
}

3 Cevap

Birinde İşte iyi bir başlangıç. PHP test edilmiştir.

/[#\w\s\.\-\[\]\=\^\~\:]+\{[\s\n\r\t]*\}/

Artık bölüme kırılma;

Bu bölüm seçici eşleşir. # Kimlikleri, \ w maçlar alphanumerics ve alt dönem sınıflar için olduğunu. Sonra onlar çok sık alışmak durumunda bazı gelişmiş css seçiciler için, ama ben şaşıracaksınız = ^ [] attı ve ~.

[#\w\s\.\-\[\]\=\^\~\:]+

İkinci bölüm kıvırcık parantez içindeki boş bir alan arar. Biz alanlarda, satırsonlarının, döner, ve sekmeler için burada özel karakterleri var. Başka bir şey varsa o maç olmayacak.

\{[\s\n\r\t]*\}

Ve burada Eğer ilgileniyorsanız ben, PHP bunu test etmek için kullanılan koddur.

<?php
$myString = <<<HERE
#myDiv a.awesome[href=google.com]{

}
HERE;
$regex = "/[#\w\s\.\-\[\]\=\^\~\:]+\{[\s\n\r\t]*\}/";
echo preg_replace($regex, "replaced!", $myString);

Bu arasında {ve} sıfır veya daha fazla boşluk karakterleri için maç olur

\{\s*\}

Onlar RegEx'in özel karakter olduğu gibi, hem kaçmak {ve} var.

\ S - vb sekmesinde, yeni hat dahil olmak üzere, herhangi bir boşluk karakter anlamına gelir ..

\ S * - boşluklarla herhangi bir sayı

Ben gerçekten zaten CSS bir regular language şüpheliyim, çünkü bu düzenli ifadeler önermiyoruz.

CSS Tidy PHP Download - Ben sadece 5 dakika içinde kendim yaptım ve bunu test ettik. Harika çalışıyor.

require( 'csstidy/class.csstidy.php' );

$tidy = new csstidy();

$tidy->parse( "
.test {
  font-weight: bold;
}

.empty {
}

.test2 {
  font-style: italic;
}" );

echo '<pre>';
echo $tidy->print->plain();

İşte çıkış var

.test {
font-weight:700;
}

.test2 {
font-style:italic;
}