2012-10-11 22 views
23

मैं रेगेक्स लिखने की कोशिश कर रहा हूं जो सीएसएस कोड से सभी हेक्स रंग निकालता है।सीएसएस हेक्स रंग मिलान करने के लिए रेगेक्स

यह वही है मैं अब है:

कोड:

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

आउटपुट:

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

) 

मैं निर्दिष्ट करने का तरीका केवल उन रंगों मिलान किया जाता है कि जो साथ समाप्त होता है पता नहीं है विराम चिह्न, सफेद जगह या नई लाइन।

+1

regex के साथ परेशान न हों। @ Modu का जवाब देखें। 'अगर (ctype_xdigit ($ रंग) && strlen ($ रंग) == 6)'। –

उत्तर

31

के बाद से एक हेक्स रंग कोड भी 3 अक्षरों शामिल हो सकते हैं, तो आप एक अनिवार्य समूह और अक्षरों और अंकों का एक वैकल्पिक समूह को परिभाषित कर सकते हैं, जब तक और विस्तृत अंकन होगा:

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

या यदि आप एक अच्छा और छोटा संस्करण चाहते हैं, आप कह सकते हैं कि आप 3 अल्फान्यूमेरिक वर्णों के 1 या 2 समूह चाहते हैं, और उन्हें मिलान के मामले को असंवेदनशील रूप से मिलान किया जाना चाहिए (/i)।

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

धन्यवाद, \ बी क्या आवश्यक था। यकीन नहीं है कि क्यों "?" हालांकि। वैसे भी, यह आवश्यकतानुसार काम करता है:/# (?: [0-9 ए-एफए-एफ] {6}) \ b/ यह उल्लेख करना भूल गया कि 3 char कोड की आवश्यकता नहीं है। – Hemaulo

+0

एक प्रश्न चिह्न के लिए शून्य या एक घटना की आवश्यकता होती है, जो दूसरे कब्जे वाले समूह को वैकल्पिक बनाती है। –

+2

वे विकल्प व्यर्थ हैं। यहां एक सरल संस्करण है: '/ # ([ए-एफए-एफ 0-9]) {3} (([ए-एफए-एफ 0-9]) {3})? \ B /' – Synchro

0

मैं पूरी तरह यकीन है कि अगर मैं इस अधिकार मिल गया नहीं कर रहा हूँ, लेकिन अगर आप केवल एक सीएसएस पंक्ति के अंत में हेक्स रंग मिलान करना चाहते हैं:

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

काम करना चाहिए, सब मैंने किया था वैकल्पिक \s; चार समूह (वैकल्पिक अर्ध-कोलन और रिक्त स्थान) और एक लाइन ब्रेक कैरेक्टर (वैकल्पिक नहीं) जोड़ें और यह काम करना प्रतीत होता है।
और @GolezTrol ने #FFF; को इंगित किया है, यह भी मान्य है।

जब इस पर परीक्षण किया:

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

उत्पादन किया गया था:

array (array('#CAB;','#ababab;')) 
19

छोटा GolezTrol's answer का संस्करण चरित्र दो बार सेट लिखित बचा जाता है:

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

आप 'i' केस-असंवेदनशील मिलान ध्वज का उपयोग कर इसे भी छोटा कर सकते हैं। '/ # ([ए-एफ 0-9] {3}) {1,2} \ b/i' – Tushar

6

स्वीकार किए जाते हैं जवाब से पता चलता है आप रेगेक्स के साथ इसे कैसे करें, क्योंकि यह आपका प्रश्न था। लेकिन आपको इसके लिए रेगेक्स का उपयोग करने की ज़रूरत नहीं है। आम तौर पर यह कैसे मैं यह कर देगी:

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

100,000 के लिए पुनरावृत्तियों:

Regex समाधान *: .0802619457245 सेकंड

strlen साथ Xdigit: .0277080535889 सेकंड

*: हेक्स: ([a-fA-F0-9]{6})

+0

इस समारोह को 100,000 बार कौन कॉल करने जा रहा है? – nbrogi

+3

मैंने किया, बस आपको यह दिखाने के लिए कि कौन सी विधि तेज है। – modu

+0

क्षमा करें, लेकिन इस तरह की चीजें पागल हैं। उस फ़ंक्शन को किसी भी PHP फ़ाइल में सबसे अधिक 5 बार कहा जाएगा? तो हम एक मिलीसेकंद के एक अंश के बारे में बात कर रहे हैं? – nbrogi

0

इस प्रश्न की उम्र के बावजूद मैं निम्नलिखित में संशोधन करना चाहता हूं:

^#([[:xdigit:]]{3}){1,2}$, जहां [[:xdigit:]][a-fA-F0-9] के लिए एक शॉर्टेंड है।

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