Регулярное выражение для медиа-запросов в CSS

Я ищу способ извлечь медиа-запросы из файла CSS.

/* "normal" css selectors @media only screen and (max-device-width: 480px) { body{-webkit-text-size-adjust:auto;-ms-text-size-adjust:auto;} img {max-width: 100% !important; height: auto !important; } } @media only screen and (max-device-width: 320px) { .content{ width: 320px; } } 

теперь мне нравится получать только медиа-запросы. Я, хотя начало всегда @media и конец поиска всегда является фигурной скобкой, за которой следуют некоторые необязательные пробелы и другая фигурная скобка.

Единственное, что у меня есть, это

 preg_match_all('#@media ?[^{]+?{XXX#',$stylesheetstring, $result); 

XXX – это недостающая часть, которую я ищу.

Текущий (без X) возвращает только первую строку (очевидно)

Предполагая, что вы хотите весь медиа-блок, я не думаю, что это правильная работа для регулярного выражения.

Однако вы можете реализовать простую функцию синтаксического анализа:

 function parseMediaBlocks($css) { $mediaBlocks = array(); $start = 0; while (($start = strpos($css, "@media", $start)) !== false) { // stack to manage brackets $s = array(); // get the first opening bracket $i = strpos($css, "{", $start); // if $i is false, then there is probably a css syntax error if ($i !== false) { // push bracket onto stack array_push($s, $css[$i]); // move past first bracket $i++; while (!empty($s)) { // if the character is an opening bracket, push it onto the stack, otherwise pop the stack if ($css[$i] == "{") { array_push($s, "{"); } elseif ($css[$i] == "}") { array_pop($s); } $i++; } // cut the media block out of the css and store $mediaBlocks[] = substr($css, $start, ($i + 1) - $start); // set the new $start to the end of the block $start = $i; } } return $mediaBlocks; }