使用PHP将CSS文件拆分为数组

g00*_*0ne 7 css php regex parsing

我想用PHP将css文件分成数组.

例如:

#selector{ display:block; width:100px; }
#selector a{ float:left; text-decoration:none; }
Run Code Online (Sandbox Code Playgroud)

进入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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

哦:编辑:我并不担心在这个例子中形成错误的CSS文件.只要它不贪心,不能防弹

小智 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));
Run Code Online (Sandbox Code Playgroud)

快速说明:正则表达式简单而无聊.它只匹配所有"任何东西,可能的空间,花括号,可能的空间,任何东西,紧密的大括号".从那里,第一个匹配是选择器,第二个匹配是属性列表.用分号拆分,你留下键/值对.一些trim()在那里摆脱空白,这就是它.

我猜你的下一个最好的选择可能是用逗号分解选择器,这样你就可以合并适用于同一事物的属性等,但我会为你保存.:)

编辑:如上所述,真正的语法分析器会更实用......但是如果你假设格式良好的CSS,你就没有理由要做任何超出最简单的"任何{任何东西}"的事情.取决于你想要用它做什么,真的.

  • 注释规则失败:-( (2认同)

ina*_*abt 6

如果对于具有多选择器和分隔线的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\,\.\:#_\-@]+)\{([^\}]*)\}/', $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);
?>
Run Code Online (Sandbox Code Playgroud)

输出:

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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:添加了对多个选择器的支持,例如:.box,.element,div {...}

  • 好,但不适用于`background-image:url("data:image/png; base64,........`值类型.. (2认同)