2012-10-11 12 views
23

Tüm hex renklerini CSS kodundan ayıklayan regex yazmaya çalışıyorum. CSS altıgen renklerini eşleştirmek için Regex

Bu

şimdi ne var:

Kodu:

$css = <<<CSS 

/* Do not match me: #abcdefgh; I am longer than needed. */ 

.foo 
{ 
    color: #cccaaa; background-color:#ababab; 
} 

#bar 
{ 
    background-color:#123456 
} 
CSS; 

preg_match_all('/#(?:[0-9a-fA-F]{6})/', $css, $matches); 

Çıktı:

Array 
(
    [0] => Array 
     (
      [0] => #abcdef 
      [1] => #cccaaa 
      [2] => #ababab 
      [3] => #123456 
     ) 

) 

Ben sadece bu renkler ile biter eşleşti belirtmek için nasıl bilmiyorum noktalama, boşluk veya satır sonu.

+1

regex ile rahatsız etmeyin. @ Modu'nun cevabı. 'if (ctype_xdigit ($ color) && strlen ($ color) == 6)'. –

cevap

31

altıgen renk kodu da 3 karakter oluşur olabilir, bu zorunlu bir grup ve harf ve rakamlardan oluşan isteğe bağlı bir grubu tanımlamak için, bu kadar uzun ve ince gösterim olacaktır:

/#([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?\b/ 

ya da eğer güzel ve kısa bir sürüm istiyorsanız, 3 alfasayısal karakterden oluşan 1 veya 2 grup istediğinizi söyleyebildiğinizi ve durumun duyarsız olarak eşleşmesi gerektiğini söyleyebilirsiniz (/i).

/#([a-f0-9]{3}){1,2}\b/i 
+0

Teşekkürler, ihtiyaç duyulan şey buydu. "Neden" olduğundan emin değil misiniz? gerçi. Her neyse, bu gerektiği gibi çalışır:/# (?: [0-9a-fA-F] {6}) \ b/ 3 char kodunun gerekli olmadığı unutulmamalıdır. – Hemaulo

+0

Bir soru işareti, ikinci yakalanan grubu isteğe bağlı hale getirerek, bir öncekinin sıfır veya bir tekrarını gerektirir. –

+2

Bu alternatifler anlamsız. İşte daha basit bir sürüm: '/ # ([a-fA-F0-9]) {3} (([a-fA-F0-9]) {3})? \ B /' – Synchro

0

Ben bu hakkın var eğer tamamen emin değilim, ama yalnızca CSS satırının sonuna onaltılık renkleri eşleştirmek istiyorsanız:

preg_match_all('/#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})[\s;]*\n/',$css,$matches); 

çalışmalı, tüm yaptığım oldu Opsiyonel \s; char grubunu (isteğe bağlı yarı kolon ve boşluklar) ve satır sonu karakterini (isteğe bağlı değil) ekleyin ve işe yaramış gibi görünüyor.
Ve @GolezTrol'in işaret ettiği gibi #FFF; da geçerlidir.

bu test:

$css = '/* Do not match me: #abcdefgh; I am longer than needed. */ 
.foo 
{ 
    color: #CAB; 
    background-color:#ababab; 
}'; 
preg_match_all('/#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})[\s;]*\n/',$css,$matches); 
var_dump($matches); 

çıkışı oldu:

array (array('#CAB;','#ababab;')) 
19
karakter iki kez set yazılı önler GolezTrol's answer ait

Kısa versiyonu:

/#([a-fA-F0-9]{3}){1,2}\b/ 
+2

“i” büyük harf duyarsız eşleşme bayrağını kullanarak kısa süreli yapabilirsiniz. '/ # ([a-f0-9] {3}) {1,2} \ b/i' – Tushar

6

kabul cevap gösterileri Regex ile nasıl yapılacağını, çünkü senin sorunun buydu. Ancak bunun için normal ifadeleri kullanmanıza gerek yoktur. Normalde bu bunu yapmak görecektir:

if(ctype_xdigit($color) && strlen($color)==6){ 
    // yay, it's a hex color! 
} 

100,000 için yineleme:

Regex çözüm *: ,0802619457245 saniye strlen ile

xdigit: ,0277080535889 saniye

*: altıgen: ([a-fA-F0-9]{6})

+0

Bu işlevi kim 100,000 kere arayacak? – nbrogi

+3

Sadece hangi yöntemin daha hızlı olduğunu göstermek için yaptım. – modu

+0

Üzgünüz, ama bu tür şeyler çıldırmış. Bu işlev herhangi bir PHP dosyasında en fazla 5 kez ne çağrılacak? Yani milisaniyenin bir kısmından mı bahsediyoruz? – nbrogi

0

Bu sorunun yaşına rağmen aşağıdakileri değerlendirmek istiyorum:

^#([[:xdigit:]]{3}){1,2}$, [[:xdigit:]], [a-fA-F0-9] için bir kısa yoldur.

Yani:
<?php preg_match_all("/^#([[:xdigit:]]{3}){1,2}$/", $css, $matches) ?>

İlgili konular