9
votes

Casser un fichier CSS dans un tableau avec PHP

Je voulais casser un fichier CSS dans une matrice avec PHP.

ex: p> xxx pré>

dans un tableau PHP ... p>

array(2) {
  ["#selector"] => array(2) {
    [0] => array(1) {
      ["display"] => string(5) "block"
    }
    [1] => array(1) {
      ["width"] => string(5) "100px"
    }
  }
  ["#selector a"] => array(2) {
    [0] => array(1) {
      ["float"] => string(4) "left"
    }
    [1] => array(1) {
      ["text-decoration"] => string(4) "none"
    }
  }
}


1 commentaires

Oups j'ai écrit quelque chose qui l'a fait l'inverse.


5 Réponses :


3
votes

Si j'étais vous, je construirais (ou trouveriez) une vraie grammaire pour le CSS et analyser de cette façon. Essayer d'écrire un analyseur pour toute langue expression non triviale (et CSS n'est clairement pas trivial, avec tous les sélecteurs de fantaisie) m'ont eu des ennuis plus que suffisamment de fois.

Exemple: http://www.phpclasses.org /package/1289-PHP-CSS-PARSER-CLASS.HTML


0 commentaires

15
votes

Ceci devrait le faire:

<?php

$css = <<<CSS
#selector { display:block; width:100px; }
#selector a { float:left; text-decoration:none }
CSS;

//
function BreakCSS($css)
{

    $results = array();

    preg_match_all('/(.+?)\s?\{\s?(.+?)\s?\}/', $css, $matches);
    foreach($matches[0] AS $i=>$original)
        foreach(explode(';', $matches[2][$i]) AS $attr)
            if (strlen(trim($attr)) > 0) // for missing semicolon on last element, which is legal
            {
                list($name, $value) = explode(':', $attr);
                $results[$matches[1][$i]][trim($name)] = trim($value);
            }
    return $results;
}
var_dump(BreakCSS($css));


3 commentaires

.. sexplode () hein? J'ai fait une double prise et vérifié le manuel: p


J'ai traduit ceci à Python lors d'un processus de migration dans l'un de mes projets, si vous êtes intéressé, Vérifiez-le .


Échoue sur des règles commentées :-(



6
votes

Si vous avez besoin de la même chose pour les règles CSS avec des sélecteurs multi-sélecteurs et avec des lignes de brise: xxx pré>

sortie: p>

array(2) {
  ["#selector"]=>
  array(2) {
    [0]=>
    array(1) {
      ["display"]=>
      string(5) "block"
    }
    [1]=>
    array(1) {
      ["width"]=>
      string(5) "100px"
    }
  }
  ["#selector a:hover div.asd, #asd h1.asd"]=>
  array(2) {
    [0]=>
    array(1) {
      ["float"]=>
      string(4) "left"
    }
    [1]=>
    array(1) {
      ["text-decoration"]=>
      string(4) "none"
    }
  }
}


3 commentaires

Ne fonctionne pas correctement si le sélecteur est multiple: .BOX, .Element, Div {...}


Bon, mais ne fonctionne pas avec arrière-plan-image: URL ("Données: image / png; base64, ........ type de valeurs ..


Cela fonctionne-t-il avec @media de Bootstrap. J'ai essayé de l'utiliser, mais cela ignore certainement.



0
votes

Je suggérerais le sélecteur (? IMS) ([A-Z0-9 \ S \, \. \: #_ \ - @ * () \ \ \ \ ( [^}] *) \} dans le Réponse de InakiBT pour une meilleure solution.


0 commentaires

0
votes

J'ajouterai aussi ma solution. J'ai dû diviser un gros fichier CSS avec toutes les requêtes de média dans les fichiers séparés, de sorte que la note mobile sur les pagesPeed acheminées pendant 10 points, car elle n'a pas besoin d'attendre l'ensemble du grand fichier CSS.

La sortie est une matrice écartée sur des requêtes multimédias. xxx


0 commentaires