2013-07-04 44 views
6

Tôi đã nhìn thấy một số câu hỏi liên quan của tôi và tôi đã thử chúng nhưng chúng không hoạt động. Tôi muốn khớp nội dung từ div với id "ngón tay cái". Nhưng regex.Success trả :(C# Trích xuất nội dung Regex của div

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

Nhiều off topic nhưng nghe có vẻ giống như một ứng cử viên cho HTML Agility Pack – Sayse

Trả lời

8

Regex không phải là một lựa chọn tốt cho phân tích các file HTML ..

HTML là không nghiêm ngặt cũng không phải là thường xuyên với định dạng của nó ..

sai Sử dụng htmlagilitypack


Tại sao sử dụng phân tích cú pháp?

xem xét regex..There của bạn là vô số trường hợp bạn có thể phá vỡ mã của bạn

  • regex của bạn sẽ không hoạt động nếu có lồng nhau divs
  • Một số divs không có một kết thúc thẻ! (trừ XHTML)

Bạn có thể sử dụng mã này để lấy nó bằng cách sử 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

Loving nhận xét về * biểu thức bất thường * :) – Charleh

+0

Tôi sẽ xem xét nó, cảm ơn. –

+0

@Charleh: D ..... – Anirudha

1

Không, tôi không nghĩ rằng anh ấy cần trốn thoát. Anh ấy có @ trước mẫu. Tôi nghĩ rằng đây là đúng:

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

Vì vậy, không đôi đôi dấu ngoặc kép

0

Hãy thử điều này:

Regex r = new Regex(@"(?<text>(<div\s*?id=(\""|&quot;|&\#34;)" 
    + @"thumb(\""|&quot;|&\#34;).*?>)(?>.*?</div>|.*?<div " 
    + @"(?>depth)|.*?</div> (?>-depth))*)(?(depth)(?!)).*?</div>", 
    RegexOptions.Singleline); 
Các vấn đề liên quan