2009-10-24 5 views
0

Je souhaite parcourir un fichier css et capturer les commentaires et le css. Je suis venu avec une expression régulière qui est presque là, mais il est pas tout à fait parfait, car il manque des propriétés multiples déclarations à savoirAnalyse de css avec une regex

ul.menu li a, # Won't capture this line 
ul.nice-menu li a { text-decoration: none; cursor:pointer; } 

Voici le regex que je travaille avec:

(\/\*[^.]+\*\/\n+)?([\t]*[a-zA-Z0-9\.# -_:@]+[\t\s]*\{[^}]+\}) 

Je l'ai testé sur rubular.com et voici ce qu'il correspond actuellement, et à quoi ressemble la sortie du tableau.

Résultat 1

[0] /* Index */ 
/* 
GENERAL 

PAGE REGIONS 
- Header bar region 
- Navigation bar region 
- Footer region   
SECTION SPECIFIC 
- Homepage 
- News */ 

[1] html { background: #ddd; } 

Résultat 2

[0] 
[1] body { background: #FFF; font-family: "Arial", "Verdana", sans-serif; color: #545454;} 

Je dois souligner que je suis encore un nouveau en ce qui concerne les expressions régulières, donc si quelqu'un peut aider et de montrer où je m qui ne va pas, ce serait très apprécié :)

BTW: J'utilise PHP et preg_match_all

+1

pouvez-vous définir quel type de sortie vous voulez? "vous voulez css et commentaires" est global pour déterminer ce que vous voulez. spécifier un tableau de quelque sorte –

+0

J'ai ajouté ce que la sortie attendue est actuellement à la question, j'espère que cette aide :) – Damian

Répondre

6

CSS ne peut pas être entièrement analysé avec une regex (voir CSS Grammaire: http://www.w3.org/TR/CSS2/grammar.html). Le {...} peut être divisé sur des lignes, par exemple, et votre version actuelle ne gérera pas cela. Si vous avez besoin de faire cela, vous devriez lire les spécifications CSS et utiliser un outil comme ANTLR pour générer un analyseur.

Voici un exemple de la spécification du W3C (http://www.w3.org/TR/CSS2/syndata.html):

@import "subs.css"; 
@import "print-main.css" print; 
@media print { 
    body { font-size: 10pt } 
} 
h1 {color: blue } 

Pas regex normale est assez puissant pour traiter imbriqué {...}, etc. et encore moins le contenu des feuilles de style importées.

+0

enlever toutes les nouvelles lignes et il sera en sécurité! – mauris

+0

@Mauris alors il y aura une seule ligne. –

+1

@Mauris il ne sera pas. il suffit de penser à "{" à l'intérieur des commentaires, des cordes, ... il devrait certainement y aller avec un parser spécialisé. –

0

Quelle langue utilisez-vous?

Vous devriez probablement utiliser une bibliothèque pour analyser le CSS. Les bibliothèques peuvent vous épargner beaucoup de chagrin.

+0

J'utilise PHP, et preg_match_all – Damian

+2

@Damian: il y a déjà des parseurs PHP PHP. – PhiLho