2013-01-03 1 views
4

Je recherche un moyen d'extraire des requêtes média à partir d'un fichier CSS.Expression régulière pour les requêtes multimédias dans 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; 
    } 
} 

maintenant je n'aime obtenir que les requêtes média. Je pense que le début est toujours @media et la fin de la recherche est toujours une accolade suivie d'un espace optionnel et d'un autre accolade.

La seule chose que j'ai est

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

étaient XXX est la partie manquante Je cherche.

L'actuel (sans X) ne retourne la première ligne (évidemment)

+0

Pourriez-vous préparer une démo sur [ideone.com] (http://ideone.com) ou [codepad.org] (http://codepad.org)? – Tadeck

+0

Voulez-vous le bloc css entier, ou juste la ligne qui commence par '@ media'? – Supericy

Répondre

7

En supposant que vous voulez tout le bloc de médias, je ne pense pas que ce soit le bon emploi pour regex.

Vous pouvez toutefois mettre en œuvre une fonction simple d'analyse syntaxique:

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; 
} 
+0

Merci, cela fait l'affaire et est légèrement plus rapide que 'preg_match_all' – Xaver

+0

génial! Merci – shox

Questions connexes