用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文件。只要它不贪婪,它不会是防弹的
答
这应做到:
<?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,没有任何理由你需要做任何事情,除了最简单的“任何东西”任何}“。取决于你想要做什么,真的。
答
如果我是你,我会为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。
糟糕我写了一些反其道而行的事。 – 2009-07-31 22:09:42