PHP

2009-07-31 7 views
6

के साथ एक सरणी में एक सीएसएस फ़ाइल तोड़ें मैं PHP के साथ एक सरणी में एक सीएसएस फ़ाइल तोड़ना चाहता था।PHP

पूर्व:

#selector{ display:block; width:100px; } 
#selector a{ float:left; text-decoration:none; } 
एक php सरणी में

...

array(2) { 
    ["#selector"] => array(2) { 
    [0] => array(1) { 
     ["display"] => string(5) "block" 
    } 
    [1] => array(1) { 
     ["width"] => string(5) "100px" 
    } 
    } 
    ["#selector a"] => array(2) { 
    [0] => array(1) { 
     ["float"] => string(4) "left" 
    } 
    [1] => array(1) { 
     ["text-decoration"] => string(4) "none" 
    } 
    } 
} 

कोई भी विचार?

ओह: संपादित करें: मैं इस उदाहरण में बीमार गठित सीएसएस फ़ाइलों के बारे में चिंतित नहीं हूं। जब तक यह लालची नहीं है तब तक बुलेटप्रूफ होने की संभावना नहीं है जब तक कि यह लालची नहीं है

+0

ओह, मैंने कुछ लिखा जो इसे दूसरी तरफ करता था। –

उत्तर

11

यह करना चाहिए:

<?php 

$css = <<<CSS 
#selector { display:block; width:100px; } 
#selector a { float:left; text-decoration:none } 
CSS; 

// 
function BreakCSS($css) 
{ 

    $results = array(); 

    preg_match_all('/(.+?)\s?\{\s?(.+?)\s?\}/', $css, $matches); 
    foreach($matches[0] AS $i=>$original) 
     foreach(explode(';', $matches[2][$i]) AS $attr) 
      if (strlen(trim($attr)) > 0) // for missing semicolon on last element, which is legal 
      { 
       list($name, $value) = explode(':', $attr); 
       $results[$matches[1][$i]][trim($name)] = trim($value); 
      } 
    return $results; 
} 
var_dump(BreakCSS($css)); 

त्वरित स्पष्टीकरण: regexp सरल और उबाऊ है। यह सिर्फ "कुछ भी, संभावित स्थान, घुंघराले ब्रैकेट, संभावित स्थान, कुछ भी, करीबी घुंघराले ब्रैकेट" से मेल खाता है। वहां से, पहला मैच चयनकर्ता है, दूसरा मैच विशेषता सूची है। अर्धविराम से विभाजित करें, और आपको कुंजी/मूल्य जोड़े के साथ छोड़ दिया गया है। व्हाइटस्पेस से छुटकारा पाने के लिए वहां कुछ ट्रिम() हैं, और यह इसके बारे में है।

मुझे लगता है कि आपकी अगली सबसे अच्छी शर्त संभवतः एक अल्पविराम द्वारा चयनकर्ता को विस्फोट करना होगा ताकि आप एक ही चीज़ पर लागू विशेषताओं को समेकित कर सकें, लेकिन मैं इसे आपके लिए सहेज दूंगा। :)

संपादित करें: जैसा ऊपर बताया गया है, एक असली व्याकरण पार्सर अधिक व्यावहारिक होगा ... लेकिन यदि आप अच्छी तरह से गठित सीएसएस मान रहे हैं, तो ऐसा कोई कारण नहीं है कि आपको "कुछ भी { कुछ भी }"। इस पर निर्भर करता है कि आप इसके साथ क्या करना चाहते हैं, वास्तव में।

+0

..सेक्सप्लोड() 'एह? मैंने डबल-टेक किया और मैन्युअल की जांच की: पी – Dan

+0

मैंने अपनी परियोजनाओं में से किसी एक में माइग्रेशन की प्रक्रिया के दौरान पाइथन में इसका अनुवाद किया है, यदि आप रुचि रखते हैं, [इसे देखें] (https: //gist.github .com/pooh110andco/5,177,066)। – Ale

+1

टिप्पणी नियमों पर विफल रहता है :-( – sumid

2

यदि मैं आप थे, तो मैं सीएसएस के लिए एक वास्तविक व्याकरण (या खोजने) का निर्माण करूंगा, और उस तरह से पार्सिंग करूँगा। किसी भी गैर-तुच्छ अभिव्यक्ति भाषा के लिए एक पार्सर लिखने की कोशिश कर रहा है (और सीएसएस स्पष्ट रूप से छोटा नहीं है, सभी फैंसी चयनकर्ताओं के साथ) मुझे पर्याप्त समय से अधिक परेशानी में मिला है।

उदाहरण: http://www.phpclasses.org/package/1289-PHP-CSS-parser-class.html

7

आप बहु चयनकर्ताओं के साथ सीएसएस नियमों के लिए और breaklines के साथ एक ही की जरूरत है:

<?php      
$css = " 
#selector 
{ display:block; 
width:100px; 
} 
#selector a:hover div.asd, #asd h1.asd { 
float:left; 
text-decoration:none; 
} 
"; 
preg_match_all('/(?ims)([a-z0-9\s\,\.\:#_\[email protected]]+)\{([^\}]*)\}/', $css, $arr); 

$result = array(); 
foreach ($arr[0] as $i => $x) 
{ 
    $selector = trim($arr[1][$i]); 
    $rules = explode(';', trim($arr[2][$i])); 
    $result[$selector] = array(); 
    foreach ($rules as $strRule) 
    { 
     if (!empty($strRule)) 
     { 
      $rule = explode(":", $strRule); 
      $result[$selector][][trim($rule[0])] = trim($rule[1]); 
     } 
    } 
} 

var_dump($result); 
?> 

उत्पादन:

array(2) { 
    ["#selector"]=> 
    array(2) { 
    [0]=> 
    array(1) { 
     ["display"]=> 
     string(5) "block" 
    } 
    [1]=> 
    array(1) { 
     ["width"]=> 
     string(5) "100px" 
    } 
    } 
    ["#selector a:hover div.asd, #asd h1.asd"]=> 
    array(2) { 
    [0]=> 
    array(1) { 
     ["float"]=> 
     string(4) "left" 
    } 
    [1]=> 
    array(1) { 
     ["text-decoration"]=> 
     string(4) "none" 
    } 
    } 
} 

अपडेट: जैसे कई चयनकर्ताओं के लिए समर्थन जोड़ा: .box, .element , div {...}

+0

अगर चयनकर्ता एकाधिक है तो सही तरीके से काम नहीं करता है: .box, .element, div {...} – setty

+0

इसे अपडेट किया गया। धन्यवाद – inakiabt

+1

अच्छा, लेकिन पृष्ठभूमि-छवि के साथ काम नहीं करता है: यूआरएल ("डेटा: छवि/पीएनजी; बेस 64, ........ मूल्यों का प्रकार .. –

संबंधित मुद्दे