2009-04-23 8 views
3

J'ai un regex pour extraire le texte à partir d'une balise de police HTML:Regex - correspondant exactement à une seule étiquette

<FONT FACE=\"Excelsior LT Std Bold\"(.*)>(.*)</FONT> 

qui fonctionne bien jusqu'à ce que j'ai quelques balises de polices imbriquées. Au lieu de faire correspondre

<FONT FACE="Excelsior LT Std Bold">Fett</FONT> 

le résultat pour la chaîne

<FONT FACE="Excelsior LT Std Bold">Fett</FONT> + <U>Unterstrichen</U> + <FONT FACE="Excelsior LT Std Italic">Kursiv</FONT> und Normal 

est

<FONT FACE="Excelsior LT Std Bold">Fett</FONT> + <U>Unterstrichen</U> + <FONT FACE="Excelsior LT Std Italic" 

Comment puis-je obtenir que la première balise?

+0

Pourriez-vous s'il vous plaît vous poste RegEx actuel? – Seb

+1

Il est déguisé en HTML dans la première ligne. @OlafK: Souhaitez-vous entourer l'expression rationnelle entre guillemets pour le faire ressortir plus? – Tomalak

Répondre

3

Vous devez utiliser l'étoile non gourmand:

<FONT FACE=\"Excelsior LT Std Bold\"[^>]*>(.*?)</FONT> 
            ^^^^^ ^^^ 
             |  | 
    match any character except ">" --+  +--------+ 
                | 
    match anything, but only up to the next </FONT> --+ 

Les avertissements habituels sur l'utilisation de regex pour traiter HTML appliquer: Vous ne devriez pas.

9

Vous devez désactiver la correspondance gloutonne avec .*? au lieu de .*.

<FONT FACE=\"Excelsior LT Std Bold\"([^>]*)>(.*?)</FONT> 

Notez que cela échouera s'il y a un attribut comme BadAttribute="<FooBar>" quelque part après l'attribut FACE pour la balise <FONT>. Cela va mélanger les deux groupes correspondants et il pourrait être complètement foiré si un attribut contient </FONT>. Il n'y a aucun moyen d'éviter cela car les expressions régulières ne peuvent pas compter les mots-clés ou les guillemets correspondants. Donc, je suis absolument d'accord avec Tomalak - essayez d'éviter d'utiliser des expressions régulières pour le traitement de XML, HTML, et d'autres langages de balisage comme ceux-ci.

2

vous devez utiliser une capture non gourmande notée '?'

<FONT FACE=\"Excelsior LT Std Bold\"(.*?)>(.*?)</FONT> 
0
<FONT[^>]*Excelsior LT Std Bold[^>]*></FONT> 

Voir poste de Phil Haack here.

Voici mon utilisation C# de cette expression. Cela a été utilisé pour supprimer des fichiers CSS et JS spécifiques d'une réponse HTTP.

const string CSSFormat = "<link[^>]*{0}[^>]*css[^>]*>"; 
const string JSFormat = "<script[^>]*{0}[^>]*js[^>]*></script>"; 

static readonly Regex OverrideCss = new Regex(string.Format(CSSFormat, "override-"), RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline); 
static readonly Regex OverrideIconsJs = new Regex(string.Format(JSFormat, "overrideicons"), RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline); 
Questions connexes