2012-06-13 11 views
5

Al momento ho una grande serie di testo HTML e ho diverse proprietà CSS che simile al seguente:un'espressione regolare per trovare una singola proprietà CSS

font:16px/normal Consolas; 
font:16px/normal Arial; 
font:12px/normal Courier; 

che è anche in bundle con diverse altre proprietà CSS e altri associati Valori e tag HTML

ho cercato di scrivere un'espressione regolare che catturerà solo questi "stili di carattere", quindi se ho avuto i seguenti due paragrafi:

<p style='font:16px/normal Arial; font-weight: x; color: y;'>Stack</p> 
<span style='color: z; font:16px/normal Courier;'>Overflow</span> 
<br /> 
<div style='font-family: Segoe UI; font-size: xx-large;'>Really large</div> 

sarebbe partita solo le proprietà che iniziano con font: e termina con un punto e virgola ;.

Ho giocato in giro con RegexHero e la più vicina che ho ottenuto è stata:

\b(?:font[\s*\\]*:[\s*\\]*?(\b.*\b);) 

che ha prodotto i seguenti risultati:

font:bold;     //Match 
font:12pt/normal Arial;  //Match 
font:16px/normal Consolas; //Match 
font:12pt/normal Arial;  //Match 
property: value;    //Not a Match 
property: value value value; //Not a Match 

ma quando ho tentato di cadere in un grande blocco di HTML, le cose sembravano confuse e venivano selezionati grossi blocchi piuttosto che entro i limiti precedentemente specificati.

Sarò lieto di fornire eventuali informazioni aggiuntive e dati di prova che posso.

+0

Non dovresti usare i delimitatori per ottenere la corrispondenza esatta? Qualcosa come^(\ b (?: Font [\ s * \\] *: [\ s * \\] *? (\ B. * \ B);)) $ – pollirrata

risposta

4

Hai lasciato il numero .* avido, il che significa che mangerà e mangerà e si fermerà solo all'ultimo punto e virgola disponibile. Aggiungi un punto interrogativo, ad esempio .*? per renderlo non-goloso.

Aggiornato:

\b(?:font\s*?:\s*([^;>]*?)(?=[;">}])) 

Ho provato tutti gli esempi in questa pagina a http://rubular.com/r/yRcED2n6wu.

+0

Grazie acheong87. Non riesco mai a imparare abbastanza sulle espressioni regolari. –

+0

Nota che 'font: sans-serif 80%;' non corrisponderà mai. – Qtax

+0

Grazie a @Qtax! Ho aggiornato la mia risposta. –

0

Non sono sicuro di cosa stia chiedendo, ma penso che questo problema possa essere risolto sostituendo i tag di stile con i CSS. Il problema potrebbe essere risolto inserendo quanto segue nel tag Head del tuo codice HTML.

<style type="text/css"> 

h1 { 

    font-family: Arial; 
    font-size: 15; 
    font-style:oblique; 

} 

h2 { 
    font-family: Courier; 
    font-size: 16; 
    font-style:oblique; 
} 
h3 { 
    font-family: Segoe UI; 
    font-size: xx-large; 
    font-style:oblique; 
} 


</style> 

Ora, tutto ciò che dovete fare per rendere l'espressione (o voi stessi) impostare uno di questi stili di font è quello di circondare con un tag in questo modo:

<h1> Cool Text! </h1> 

Good Luck!

+0

Tristemente - in questo caso non ho il controllo sull'input –

+0

Si potrebbe "prendere il controllo" dell'input scrivendo un codice PHP o Javascript che aggiunge solo questi nella parte anteriore. Sarebbe abbastanza semplice – user1453967

2

Prova questa RegEx:

(?:font:[^;]*); 

che corrisponda font:16px/normal Arial; e font:16px/normal Courier; dal frammento di sopra.

+0

Grazie Barry - questo sembra funzionare fino ad ora (e come sempre mi sento sempre come complicare le espressioni regolari) –

+1

Questo fallirà se lo stile del carattere è l'ultimo nel suo gruppo e non chiuso da un punto e virgola. –

4

Prova questa

\b((?:font:[^;]*?)(?:;|')) 

Spiegazione

\b    # Assert position at a word boundary 
(    # Match the regular expression below and capture its match into backreference number 1 
    (?:   # Match the regular expression below 
     font:   # Match the characters “font:” literally 
     [^;]   # Match any character that is NOT a “;” 
     *?    # Between zero and unlimited times, as few times as possible, expanding as needed (lazy) 
    ) 
    (?:   # Match the regular expression below 
        # Match either the regular expression below (attempting the next alternative only if this one fails) 
     ;    # Match the character “;” literally 
     |    # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     &apos;    # Match the character “&apos;” literally 
    ) 
) 
+0

Grazie Cylian - questo funziona –

+0

@RionWilliams: Prego – Cylian

1

Io suggerirei:

\bfont\s*:\s*([^;}"'<>]+)(?<=\S) 

che sarà anche lavorare per i casi in cui altre risposte falliscono. Ad esempio:

.foo { font: sans-serif 80% } 
... style="font: sans-serif 80%" ... 
+0

Ti ho votato, per la tua correzione. Grazie –

+0

@ acheong87, t matte, ti ho già fatto +1 prima del mio commento. :-) – Qtax

Problemi correlati