2009-08-31 5 views
0

Besoin d'un maître regex ici!Regex pour correspondre aux propriétés de style HTML

<img src="\img.gif" style="float:left; border:0" /> 
<img src="\img.gif" style="border:0; float:right" /> 

avec le code HTML ci-dessus, je besoin d'un modèle de regex qui correspondent à "float: right" ou "float: left" mais seulement sur une balise img.

Merci d'avance!

+0

Dans quelle langue travaillez-vous? – gnarf

+0

duplicata possible de [Pouvez-vous fournir quelques exemples de pourquoi il est difficile d'analyser XML et HTML avec une regex?] (Http://stackoverflow.com/questions/701166/can-you-provide-some-exemples-de- pourquoi-il-est-difficile d'analyser-xml-et-html-avec-un-rege) –

+0

duplication possible de [tags ouverts RegEx match sauf tags autonomes XHTML] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-balises autonomes) –

Répondre

3
/<img\s[^>]*style\s*=\s*"[^"]*\bfloat\s*:\s*(left|right)[^"]*"/i 

doivent vous conseiller, si: dans mon expérience, peu importe ce que vous écrivez regex, quelqu'un sera en mesure de venir avec HTML valide qu'il casse. Si vous voulez vraiment le faire d'une manière générale, fiable, vous devez analyser le HTML, ne pas jeter des expressions rationnelles à lui.

+0

Vous êtes l'homme. – Kappers

+1

Je ne sais pas pourquoi quelqu'un ferait cela, mais 'style="float:left"' –

+0

Ou utilisez des guillemets simples pour l'attribut de style. Ou utilisez des guillemets * no * pour l'attribut style. Ou incorporez des balises HTML entières dans des attributs qui le supportent validement en tant que valeurs, avant l'attribut de style. Comme je l'ai dit, si vous voulez quelque chose qui se rapproche de la fiabilité, vous devez analyser. – chaos

2

Vous ne devriez vraiment pas utiliser regex pour analyser html ou xml, il est impossible de concevoir une regex infaillible qui va gérer tous les cas de coin. Au lieu de cela, je suggère de trouver une bibliothèque html-parsing pour la langue de votre choix.

Cela dit, voici une solution possible en utilisant regex.

<img\s[^>]*?style\s*=\s*".*?(?<"|;)(float:.*?)(?=;|").*?" 

Le « float: » sera capturé dans le seul groupe de capture là, ce qui devrait être le numéro 1.

Le regex correspond essentiellement le début d'une balise img, suivi de tout type de caractère n'est pas une parenthèse fermante un nombre de fois, suivi de l'attribut style. Dans la valeur de l'attribut style, le float: peut être n'importe où dans l'attribut, mais ne doit correspondre qu'au style float réel (ie précédé du début de l'attribut ou d'un point-virgule suivi d'un point-virgule ou de la fin de l'attribut) .

0

Test cette code C#:

  string[] test = new String[] { 
       "<img src=\"\\img.gif\" style=\"float:left; border:0\" />", 
       "<img src=\"\\img.gif\" style=\"border:0; float:right\" />" 
      }; 
      Regex regex = new Regex(@"\<img[^>]*?style[\s]*?=.*?float:([\w]+).*?/\>", RegexOptions.Compiled); 
      foreach (String s in test) 
      { 
       Match match = regex.Match(s); 
       if (match.Success) 
       { 
        Console.WriteLine(match.Groups[1].Value); 
       } 
      } 
0

Je suis d'accord avec Sean Nyman, il est préférable de ne pas utiliser une expression régulière (au moins pas pour rien permanent). Pour quelque chose d'ad-hoc et un peu plus durable, vous pouvez essayer:

/<img\s(?:\s*\w+\s*=\s*(?:'[^']*'|"[^"]*"))*?\s*\bstyle\s*=\s*(?:"[^"]*?\bfloat\s*:\s*(\w+)|'[^']*?float\s*:\s*(\w+)/i