Это должно сделать это:
<?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, нет никаких причин, по которым вам нужно делать что-то, кроме простейшего из "что-либо {что-нибудь}" , Зависит от того, что вы хотите с ним делать, действительно.