Это следует сделать это:
<?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));
Быстрый Объяснение: Регулярное выражение просто и скучный. Он просто соответствует всем «всем, возможному пространству, фигурной скобке, возможному пространству, чему угодно, закрывает фигурные скобки». Оттуда первое совпадение является селектором, второе совпадение - списком атрибутов. Разделите это точкой с запятой, и вы останетесь с парами ключ/значение. Некоторые trim() там, чтобы избавиться от пробелов, и это все.
Я предполагаю, что ваша следующая лучшая ставка, вероятно, будет заключаться в том, чтобы взорвать селектор запятой, чтобы вы могли консолидировать атрибуты, относящиеся к одной и той же вещи и т. Д., Но я сохраню это для вас. :)
Редактировать: Как уже упоминалось выше, реальный грамматический анализатор был бы более практичным ... но если вы принимаете хорошо сформированный CSS, нет причин, по которым вам нужно делать что-либо помимо простейшего из " что-нибудь }". На самом деле зависит от того, что вы хотите с этим делать.
К сожалению, я написал что-то, что делало это наоборот. –