2013-07-04 5 views
6

J'ai vu quelques questions connexes à moi, et j'ai essayé mais ils ne fonctionnent pas. Je veux faire correspondre le contenu d'un div avec l'ID "thumbs". Mais le regex.Success retourne false :(C# Regex extrait le contenu d'un div

Match regex = Regex.Match(html, @"<div[^>]*id=""thumbs"">(.+?)</div>"); 
+8

partiellement hors sujet, mais sonne comme un candidat pour le HTML Agility Pack de – Sayse

Répondre

8

Regex n'est pas un bon choix pour l'analyse syntaxique des fichiers HTML ..

HTML est pas stricte, ni est-il régulier avec son format ..

Utilisation htmlagilitypack


Pourquoi analyseur utiliser?

Tenir compte votre regex..There sont nombre infini de cas où vous pouvez casser votre code

  • Votre regex ne fonctionnera pas s'il y a des imbriquées divs
  • Certains divs n'avez pas une balise de fin ! (sauf XHTML)

Vous pouvez utiliser ce code pour récupérer à l'aide HtmlAgilityPack

HtmlDocument doc = new HtmlDocument(); 
doc.Load(yourStream); 

var itemList = doc.DocumentNode.SelectNodes("//div[@id='thumbs']")//this xpath selects all div with thubs id 
        .Select(p => p.InnerText) 
        .ToList(); 

//itemList now contain all the div tags content having its id as thumbs 
+0

Aimer le commentaire sur * expressions irrégulières :) – Charleh

+0

Je vais regarder, merci. –

+0

@Charleh: D ..... – Anirudha

1

Non, je ne pense pas qu'il a besoin d'évasions. Il a @ devant le motif. Je pense que cela est correct:

<div[^>]*id="thumbs">(.+?)</div> 

donc pas de double guillemets doubles

0

Essayez ceci:

Regex r = new Regex(@"(?<text>(<div\s*?id=(\""|&quot;|&\#34;)" 
    + @"thumb(\""|&quot;|&\#34;).*?>)(?>.*?</div>|.*?<div " 
    + @"(?>depth)|.*?</div> (?>-depth))*)(?(depth)(?!)).*?</div>", 
    RegexOptions.Singleline);