Дал попробовать с помощью расширенного регулярного выражения с recursive pattern больше для интереса и практики :)
$code = '
#x{ a:b;c:d;}
@media pla pla {
#x{ a:b;c:d;}
#x{ a:b;c:d;}
#x{ a:b;c:d;}
}
#z{ a:b;c:d;}';
// --------------------------
// remove comments first, if there are
#$code = preg_replace('~/\*.*?\*/~s', "", $code);
// try it with a recursive pattern
$recursive_pattern = '~(?:^|\n)\s*\K[^\s{][^{]*?\s*{(?:[^{}]+|(?R))*}~';
$result = array();
if(preg_match_all($recursive_pattern, $code, $out))
{
foreach($out[0] AS $k => $v)
{
// break into -> start { inner }
if(preg_match('~^([^{]+?)\s*{\s*(.*?)\s*}\s*$~s', $v, $out2))
{
// set inner -> trim/expand spaces
$result[$out2[1]] = ltrim(preg_replace(
// |start sp |newline |;} -> ; } | 2+ spaces -> 1
array('~^ +~m', '~\r?\n~', '~;(?=[^\s])~m', '~\s{2,}~'),
array("", " ", "; ", " "),
$out2[2]));
}
}
}
// check output
echo "<pre>"; var_export($result); echo "</pre>";
выход:
array (
'#x' => 'a:b; c:d;',
'@media pla pla' => '#x{ a:b; c:d; } #x{ a:b; c:d; } #x{ a:b; c:d; }',
'#z' => 'a:b; c:d;',
)
Краткое объяснение:
(?:^|\n)
В строке запуска или новой строки
\s*
любое количество бее т е-пространство
\K
сброса Начало матча
[^\s{][^{]*?
один характер, что нет белого пространства или {
следует, как некоторые из любых, которые не являются {
\s*
следует любому количество белых пространств
\{(?:[^{}]+|(?R))*}
рекурсивная часть: соответствовать {
с последующим любым количеством символов, которые не являются {}
или (R)
начала над всем этим ... }
Строго говоря, вы не можете анализировать CSS с помощью регулярных выражений, потому что грамматика CSS не классифицируется как «[Обычный язык] (http://en.wikipedia.org/wiki/Regular_language)». – Dai
Полностью раздутый компилятор компилятора, такой как lex/yacc, flex/bison, ANTLR и т. Д., Мог бы справиться с ним (если он может работать под PHP), но, вероятно, будет излишним для CSS. Чтобы использовать только предварительные вызовы PHP, вам нужно будет самостоятельно создать парсер, используя регулярные выражения, чтобы распознавать его, но выполняйте большую часть работы самостоятельно. –
Я создаю компрессор css с этим кодом preg_match_all ('/ \ @ import [^ \;] * \; /', $ cssx, $ p); return str_ireplace ('imagedata', 'url (data:', str_ireplace ('url (/ template /'. $ _FCSSILE. '/ images/http: //', 'url (http: //', str_ireplace ('{ } ',' {} ', str_ireplace (' url (',' url (/ template/'. $ _FCSSILE.'/images/', str_ireplace (' url (data: ',' imagedata ', str_ireplace (array (' ; ','} ',' {',': ',' {',' '), array ('; ','} ',' {',': ',' {',' '), str_ireplace (array ("\ r \ n", "\ r", "\ n", "\ t", ''), '', preg_replace ('!/\ * [^ *] * \ * + ([^ /] [^ *] * \ * +) * /! ',' ', $ cssx)))))))); – urorbit