这必须以某种方式简单,但我无法弄明白并已经整整一天。
我想将一个CSS文件解析为一个包含键和值的数组:
Array('#idname' => Array('overflow' => hidden, 'color' => '#FFF'));
我通过使用正则表达式删除它们来忽略所有媒体查询,并删除所有空格。
//Remove all media queries
$cssFromLink = preg_replace("/@media.*?}}/i", '', $cssFromLink);
//Remove all whitespace
$cssFromLink = str_replace(' ','', $cssFromLink);
我想要的就是能够在列表中搜索id或classname,然后提取像background-color这样的属性。
像Sabberworm和其他CSS解析器这样的图书馆似乎不适合我,他们要么似乎永远不做,要么什么也不做,或者抛出致命的错误。我在apple.com的css上尝试这个。
所有其他解决方案看起来对我来说同样复杂,但几乎没有一个解决方案似乎专门用于apple.com,我无法在热门网站上崩溃。
答案 0 :(得分:1)
JapanPro在Parse a CSS file with PHP给出的答案对我来说是最好的。它仍然有一些错误(a}在一些id的前面,并且我不确定使用正则表达式是否是解决每种情况的最佳方法,但是现在我将使用它。
<?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($attr) > 0) // for missing semicolon on last element, which is legal
{
// Explode on the CSS attributes defined
list($name, $value) = explode(':', $attr);
$results[$matches[1][$i]][trim($name)] = trim($value);
}
return $results;
}
var_dump(BreakCSS($css));
答案 1 :(得分:0)
我刚刚做了这个,试试看:
<?php
//To test
$string = "#id {
overflow: hidden;
color: #fff;
}
#id2 {
margin: 0px;
height: 100%;
}";
//Call the function and print it out
$css_array = cssToArray($string);
echo "<pre>";
print_r($css_array);
//The actual function
function cssToArray($css){
//Regex to find tags and their rules
$re = "/(.+)\{([^\}]*)\}/";
preg_match_all($re, $css, $matches);
//Create an array to hold the returned values
$return = array();
for($i = 0; $i<count($matches[0]); $i++){
//Get the ID/class
$name = trim($matches[1][$i]);
//Get the rules
$rules = trim($matches[2][$i]);
//Format rules into array
$rules_a = array();
$rules_x = explode(";", $rules);
foreach($rules_x as $r){
if(trim($r)!=""){
$s = explode(":", $r);
$rules_a[trim($s[0])] = trim($s[1]);
}
}
//Add the name and its values to the array
$return[$name] = $rules_a;
}
//Return the array
return $return;
}