2009-07-31 33 views
6

我想用PHP將一個css文件分解成一個數組。用PHP打破一個CSS文件到一個數組中

例:

#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" 
    } 
    } 
} 

任何想法?

哦:編輯:我不擔心在這種情況下形成的CSS文件。只要它不貪婪,它不會是防彈的

+0

糟糕我寫了一些反其道而行的事。 – 2009-07-31 22:09:42

回答

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

快速說明:正則表達式是簡單枯燥。它只是匹配所有「任何東西,可能的空間,大括號,可能的空間,任何東西,緊密的大括號」。從那裏,第一場比賽是選擇器,第二場比賽是屬性列表。用分號拆分,然後用鍵/值對留下。一些修剪()在那裏擺脫空白,就是這樣。

我在猜測你的下一個最好的選擇可能是用逗號分解選擇器,這樣你就可以整合適用於同一事物的屬性等等,但我會爲你保存它。 :)

編輯:如上所述,一個真正的語法分析器會更實用...但如果你假設格式良好的CSS,沒有任何理由你需要做任何事情,除了最簡單的「任何東西」任何}「。取決於你想要做什麼,真的。

+0

..`sexplode()`呃?我做了一個雙重檢查並檢查了手冊:P – Dan 2011-03-27 20:54:21

+0

如果您感興趣,我已經在一個項目中的遷移過程中將其翻譯爲Python,[請查看](https://gist.github的.com/pooh110andco/5177066)。 – Ale 2013-03-16 16:09:36

2

如果我是你,我會爲CSS構建(或查找)一個真正的語法,並以這種方式進行解析。試圖爲任何不平凡的表達式語言編寫解析器(而CSS顯然不是微不足道的,所有的花式選擇器)都讓我陷入了麻煩的次數。

例子:http://www.phpclasses.org/package/1289-PHP-CSS-parser-class.html

7

如果您需要相同的多選擇CSS規則和特徵線:

<?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 {...}