Этот шаблон находит все селекторы и превращает правила в массивы ключ-значение. Он должен работать на хорошо сформированном CSS, в противном случае может потребоваться некоторая настройка.
Идея состоит в том, что в CSS не будет ничего, кроме селекторов в скобках правил. Он ищет строку, пока не доходит до начального скобка, и интерпретирует ее как селектор. Таким образом, он в основном ищет «not {», и когда он достигает {
, он знает, что нашел селектор. Из-за этого он может некорректно обрабатывать @import
с, но это также может быть учтено.
Код взят из моего CSS-компилятора и парсера , который получил много идей от Андреаса Лагерквиста
function callback($match)
{
// Normalize whitespace from selector
$selector = trim(preg_replace('/\s\s+/', ' ', $match[1]));
// Turn the rules into key-value array
$rules_str = str_replace(array('{', '}'), '', trim(preg_replace('/\s\s+/', ' ', $match[2])));
$rules_pieces = explode(';', $rules_str);
$rules = array();
foreach ( $rules_pieces as $rule )
{
// No key-value pair?
if ( ! strstr($rule, ':') ) continue;
list($key, $value) = explode(':', trim($rule));
$rules[$key] = trim($value);
}
// Do some stuff
echo $selector . PHP_EOL;
}
$css = "
body {
font: foo; size: 1px;
}
#foo .bar div {
foo: bar;
foooo: bar;
}
#foo .bar div { foo: bar; }
";
preg_replace_callback('/([^{;]+)(\{[^}]+\})/', 'callback', $css);