Je voulais casser un fichier CSS dans une matrice avec PHP.
ex: p> 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"
}
}
}
5 Réponses :
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. p>
Exemple: http://www.phpclasses.org /package/1289-PHP-CSS-PARSER-CLASS.HTML P>
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));
.. sexplode () code> 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 :-(
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: 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"
}
}
}
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, ........ code> type de valeurs ..
Cela fonctionne-t-il avec @media de Bootstrap. J'ai essayé de l'utiliser, mais cela ignore certainement.
Je suggérerais le sélecteur (? IMS) ([A-Z0-9 \ S \, \. \: #_ \ - @ * () \ \ \ \ ( [^}] *) \} code> dans le Réponse de InakiBT pour une meilleure solution. P >
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. p>
Oups j'ai écrit quelque chose qui l'a fait l'inverse.