2010-07-02 6 views
5

J'ai une chaîne en tant que source HTML et je veux vérifier si la source HTML qui est une chaîne contient une balise qui n'est pas ouverte.Vérification d'une chaîne HTML pour les balises non ouvertes

Par exemple, la chaîne ci-dessous contient </u> après WAVEFORM qui n'a pas d'ouverture <u>.

WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES, 

Je veux juste vérifier ces types de variables non ouvert et je dois ajouter l'étiquette ouverte au début de la chaîne?

Répondre

6

Pour ce cas spécifique, vous pouvez utiliser HTML Agility Pack pour affirmer si le HTML est bien formé ou si vous avez des balises non ouvertes.

var htmlDoc = new HtmlDocument(); 

htmlDoc.LoadHtml(
    "WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,"); 

foreach (var error in htmlDoc.ParseErrors) 
{ 
    // Prints: TagNotOpened 
    Console.WriteLine(error.Code); 
    // Prints: Start tag <u> was not found 
    Console.WriteLine(error.Reason); 
} 
0

Pas si facile. Vous ne pouvez pas utiliser directement un analyseur HTML car ce n'est pas du HTML valide, mais vous ne pouvez pas facilement lancer une regex sur l'ensemble, car les regex ne peuvent pas gérer l'imbrication ou d'autres complications HTML.

Probablement sur le meilleur que vous pourriez faire serait d'utiliser une regex pour trouver chaque structure de balisage, par exemple. Quelque chose comme:

<(\w+)(?:\s+[-\w]+(?:\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^'">\s][^>\s]*)))?)*\s*> 
|</(\w+)\s*> 
|<!--.*?--> 

Commencez par une liste vide de tags à ouvrir et une liste vide de tags à fermer. Pour chaque correspondance dans la chaîne, regardez les groupes 1 et 2 pour voir si vous avez une balise de début ou de fin. (Ou un commentaire que vous pouvez ignorer.)

Si vous avez une étiquette de début, vous devez savoir si elle doit être fermée, c'est-à-dire. si c'est l'un des tags de modèle de contenu EMPTY comme <img>. Si un élément est EMPTY, il n'a pas besoin d'être fermé, vous pouvez donc l'ignorer. (Si vous avez XHTML, tout ceci est un peu plus simple.)

Si vous avez une balise de début, ajoutez le nom du point dans le groupe d'expressions rationnelles à la liste des balises à fermer. Si vous avez une balise de fin, supprimez une balise à la fin de la liste des balises à fermer (il doit s'agir du même nom de balise que là-dessus, sinon vous avez un balisage non valide. Dans la liste des étiquettes à fermer, ajoutez plutôt le nom de la balise à la liste des balises à ouvrir

Une fois que vous avez atteint la fin de la chaîne d'entrée, ajoutez les balises d'ouverture de balise la chaîne dans l'ordre inverse, et ajouter les balises de fermeture pour les balises-à-proximité de la fin, à nouveau dans l'ordre inverse

(Ouais, je suis en train d'analyser HTML avec regex. Si vous ne pouvez pas faire quelque chose pour éviter d'avoir déjà découpé votre balisage au milieu d'une balise, faites-le.)

+0

tag html et regexp n'est pas vraiment une bonne idée –

+2

Gosh, vraiment, pensez-vous? – bobince