2010-09-15 36 views
2

我需要解析像一些CSS代碼:PHP簡單的CSS串分析器

color: black; 
font-family:"Courier New"; 
background:url('test.png'); 
color: red; 
--crap; 

分爲:

array (
    'color'=>'red', 
    'font-family'=>'"Courier New"', 
    'background'=>'url(\'test.png\')', 
    '--crap'=>'' 
) 
  • 我需要通過PHP來做到這一點。我可以通過regexp很容易地看到這一點(對於那些瞭解它的人來說,很容易,不像我自己:-))。
  • 我需要將結果數組「歸一化」,即使它們在源中,令牌之間也不應該有任何尾隨空格。
  • 無價值的CSS令牌應該只包含在數組中。 (參見 - 廢話)
  • 引號(和一般值)應保持不變,除了額外的格式(空格,製表符);通過trim()或通過相關的正則表達式開關輕鬆移除。
  • 請不要在這一點上,我特別是不需要一個完整的CSS解析器,即,不需要解析塊({...})或選擇器(a.myclass#myid)。
  • 哦,考慮到我將這個東西放在一個數組中,如果最後的項目(color:red;完全覆蓋原始項目(color:black;)完全沒問題。
+0

爲什麼在'--crap'之後沒有':'? – codaddict 2010-09-15 06:38:46

+0

某些專有CSS不是key:值格式。我只想簡單地支持這種格式。 – Christian 2010-09-15 06:42:00

回答

2

下面是一個簡單的版本:

$a = array(); 
    preg_match_all('/^\s*([^:]+)(:\s*(.+))?;\s*$/m', $css, $matches, PREG_SET_ORDER); 
    foreach ($matches as $match) 
      $a[$match[1]] = isset($match[3]) ? $match[3] : null; 

輸出示例:

array(4) { 
    ["color"]=> 
    string(3) "red" 
    ["font-family"]=> 
    string(13) ""Courier New"" 
    ["background"]=> 
    string(15) "url('test.png')" 
    ["--crap"]=> 
    NULL 
} 

不與任何測試,除了源數據,所以我敢肯定,它有缺陷。可能足以讓你開始。

+0

這聽起來就是我需要的。謝謝! – Christian 2010-09-15 06:42:42

0

你可以試試:

$result = array(); 
if(preg_match_all('/\s*([-\w]+)\s*:?\s*(.*?)\s*;/m',$input,$m)) 
     var_dump($m); 
     // $m[1] contains all the properties 
     // $m[2] contains their respective values. 
     for($i=0;$i<count($m[1]);$i++) { 
       $result[$m[1][$i]] = $m[2][$i]; 
     } 
} 
+0

沒有這樣的假設,對不起;-) – Christian 2010-09-15 06:58:39

+0

它現在沒有任何假設。 – codaddict 2010-09-15 07:06:49

0

我發現這幾個星期回來,看起來很有趣。

http://websvn.atrc.utoronto.ca/wsvn/filedetails.php?repname=atutor&path=/trunk/docs/include/classes/cssparser.php

例子:

$Parser = new cssparser(); 
$Results = $Parser->ParseStr("color: black;font-family:"CourierNew";background:url('test.png');color: red;--crap;"); 
+0

考慮到我需要捕獲任何CSS數據,我真的不需要這個。還考慮到它分析選擇器(並驗證它們?!),這是一個巨大的不走。 – Christian 2010-09-15 06:59:59

+0

而不是使用ParseStr你可以使用Parse('path/to/style.css')'Parse',這是我發佈這個主要的原因,告訴你一個替代所有每個人都會發布的正則表達式,我的版本tho更大可能快得多 – RobertPitt 2010-09-15 08:07:12

0

爲什麼不來看看CSSTidy

+0

同樣,該代碼特別解析完整的CSS格式;而我只需要解析CSS塊(或樣式屬性)中的格式。 – Christian 2010-09-15 07:00:57