2014-01-08 7 views
1

У меня есть файл CSS и нужно рагез стиль какнеобходимо регулярное выражение для разбора кода

#x{ a:b;c:d;} 

, что это хорошо, но есть стиль, как

@media pla pla { 
    #x{ a:b;c:d;} 
    #x{ a:b;c:d;} 
    #x{ a:b;c:d;} 
} 

этот стиль я не знаю, как я написать регулярное выражение для него, мне нужно привести, как это

$x(0) = @media pla pla 
$(1) =#x{ a:b;c:d;} 
     #x{ a:b;c:d;} 
     #x{ a:b;c:d;} 
+0

Строго говоря, вы не можете анализировать CSS с помощью регулярных выражений, потому что грамматика CSS не классифицируется как «[Обычный язык] (http://en.wikipedia.org/wiki/Regular_language)». – Dai

+0

Полностью раздутый компилятор компилятора, такой как lex/yacc, flex/bison, ANTLR и т. Д., Мог бы справиться с ним (если он может работать под PHP), но, вероятно, будет излишним для CSS. Чтобы использовать только предварительные вызовы PHP, вам нужно будет самостоятельно создать парсер, используя регулярные выражения, чтобы распознавать его, но выполняйте большую часть работы самостоятельно. –

+0

Я создаю компрессор 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

ответ

2

Дал попробовать с помощью расширенного регулярного выражения с 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) начала над всем этим ... }
+0

Код = ' #a {a: 1; a: 2;} @media { #b {b: 1; b: 2; } #c {c: 1; c: 2; } #d {d: 1; c: 2; } } #z {z: 1; z: 2;} '; result = array ( '#a' => 'a: 1; a: 2;', '#d' => 'd: 1; c: 2;}', '#z' => 'z : 1; z: 2; ', ) – urorbit

+1

Я попробую этот $ recursive_pattern =' ~ (?:^| \ N) \ s * [^ {] +? \ S * {(?: [^ {}] + | (R?) *}) ~ '; и его работа, спасибо :) – urorbit

Смежные вопросы