2016-09-06 59 views
-1

我有我只是想從文本一個HTML字符串:C#Regrex提取HTML文本

string html = "<span class="MyText" id="1">  SomeText blah blah</span>"; 

於是我就用下面的表達式:

public static string StripHTMLTags(string source) 
{ 
    return Regex.Replace(source, "<.*?>", string.Empty); 
} 

但有時HTML字符串中包含幾行HTML的:

string html = "<span class="MyText" id="1">SomeText blah blah</span<br><span class="MyText" id="2">SomeText blah blah 1</span><br><span class="MyText" id="2">SomeText blah blah2</span>"; 

所以現在我想提取出那是<span>標記和保存位置之間的文本e他們在列表或數組或行。

注: 我解析自定義HTML只會有兩個標籤突破和跨距標籤。

我該如何使用Regex來做到這一點?

+2

HTML不夠規律,不能用正則表達式解析;) –

+0

我解析的自定義HTML將只有兩個標記

+0

我的應用程序是從服務器接收HTML文本的C#Windows應用程序。 –

回答

1

用正則表達式解析HTML很麻煩並且出錯。看看比較着名的StackOverflow後RegEx match open tags except XHTML self-contained tags

我建議爲此使用一個庫。一種廣泛使用的是通過Nuget提供的Html Agility Pack http://html-agility-pack.net

編輯:

爲了得到HTML的內部文本,你可以使用這樣的事情:

var pageDoc = new HtmlDocument(); 
pageDoc.LoadHtml(pageContent); 
var pageText = pageDoc.DocumentNode.InnerText; 
+0

我解析的自定義HTML將只有兩個標籤

+0

@HarryBoy - 這可能會隨着時間而改變。我有一個樣本添加到帖子。我認爲代碼比可以變得相當複雜的RegEx-Expression更容易理解。 –

0

我不知道,如果你可以用不同的正則表達式語句解決這個問題(只不太瞭解正則表達式),但是你可以做的就是每次發生「> <」時分割字符串,然後提取每個子字符串的文本。

另外http://regexr.com/可能會幫助您嘗試不同的陳述。

編輯:'</span>'後總會有'< br''嗎?

+0

沒有,總是有'
',只有​​當有幾條線收到有'
' –

0

要小心是否在非私人應用程序中運行。正如我所說的:

HTML是不夠的定期用正則表達式

然而,這個簡單的HTML片段可以用下面一個被解析解析:

string txt = 
    @"""<span class=""MyText"" id=""1"">SomeText blah blah</span<br><span class=""MyText"" id=""2"">SomeText blah blah 1</span><br><span class=""MyText"" id=""2"">SomeText blah blah2</span>"""; 

var matches = Regex.Matches(txt, "(?<=>)([^<]+)(?=<)"); 
foreach (Match match in matches) 
    Console.WriteLine(match.Value); 

它產生:

SomeText blah blah 
SomeText blah blah 1 
SomeText blah blah2