用PHP打破一个CSS文件到一个数组中

问题描述:

我想用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

这应做到:

<?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

如果我是你,我会为CSS构建(或查找)一个真正的语法,并以这种方式进行解析。试图为任何不平凡的表达式语言编写解析器(而CSS显然不是微不足道的,所有的花式选择器)都让我陷入了麻烦的次数。

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

如果您需要相同的多选择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 {...}

我会建议选择(?ims)([a-z0-9\s\,\.\:#_\[email protected]*()\[\]"=]+)\{([^\}]*)\}answer of inakiabt为更好的s olution。