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,你就没有理由要做任何超出最简单的"任何{任何东西}"的事情.取决于你想要用它做什么,真的.
如果对于具有多选择器和分隔线的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 {...}