2010-05-28 6 views
2

Avant de dire "oh non, pas encore" ici, je déclare mon cas. J'analyse une partie de la sortie HTML et la seule chose qui m'intéresse est les attributs name et value de chaque balise <input/. HTML est en fait un fragment HTML, peut ne pas être bien formé. Je n'ai pas d'analyseur DOM ou HTML et je n'essaie pas d'analyser les éléments imbriqués de toute façon. Le problème est que je ne connais pas l'ordre ou le nombre d'attributs, donc il pourrait être <input name="foo" value="boo"/> ou <input type="hidden" name=foo> ou <input id=blah value='boo' src="image.png" name="foo" type="img"/>.Obtenir le nom et la valeur de l'étiquette d'entrée

Existe-t-il une seule expression régulière qui obtiendrait les valeurs name et value dans un ordre prévisible? Je ne l'aurais pas posé la question si je pouvais supposer que name attribut précède toujours value, mais malheureusement, ce n'est pas le cas

+0

Je ne sais pas pour vous, mais * "Le problème est que je ne connais pas l'ordre ou le nombre d'attributs" * serait dans mon monde une raison suffisante pour utiliser un analyseur DOM. –

+0

Je suis sur la plate-forme qui n'a pas intégré dans l'analyseur et je ne veux pas apporter un externe – Bostone

Répondre

2

Pour obtenir les valeurs de name et value dans le même groupe de capture, quel que soit l'ordre, vous pouvez essayer

<input (?=[^>]* name=["']([^'"]*)|)(?=[^>]* value=["']([^'"]*)|) 

si votre implémentation regex prend en charge lookaheads. Ceci suppose que les valeurs sont quotées.

0

Voici une solution en utilisant la syntaxe d'expression régulière de .NET:

var regex = new Regex(@" 
     <input 
      (
       \s* 
       (?<name>[^=]+) 
       = 
       (['""]) 
       (?<value>.*?) 
       \2 
      )* 
     \s*/?> 
    ", RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase); 

foreach(Match m in regex.Matches(input)) 
{ 
    var names = m.Groups["name"]; 
    var values = m.Groups["value"]; 

    for(int i = 0; i < names.Captures.Count; i++) 
    { 
     Console.WriteLine("Name = {0} Value = {1}", 
       names.Captures[i].Value, values.Captures[i].Value); 
    } 
} 

Pour une entrée chaîne comme:

bla bla < nom entrée = "salut" value = test "monde" = 'foo'/> bla bla

Affichera:

Name = Nom de la valeur = salut
Name = valeur Valeur = monde
Nom = test Valeur = toto

Il ne gère pas name=value (à savoir pas de guillemets autour de la valeur) mais cela ne devrait pas être trop difficile à ajouter pour le support.

Questions connexes