2015-04-15 208 views
0

我需要從html字符串中獲取html元素<div class='important-contents'>...</div>中的內容(沒有html標籤的字符串)。如何讓HTML文本中包含的文本不包含html標籤文本

其實我可以使用下面的代碼加載所有文本。

string htmlString= "<html>...</html>"; 
    Regex regex = new Regex("\\<[^\\>]*\\>"); 
    return regex.Replace(htmlString, String.Empty); 

如何指定important-contents類元素中的內容?

+0

我不認爲正則表達式是這裏的最佳路線,也有從內存中,可以得到標籤的內容HTML類... –

+0

請肯定要閱讀[RegEx match open tags but XHTML self-contained tags](http:// stackoverflow。com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags /)來構建合理的RegEx。 –

+2

@AustinFrench顯然不是。但OP應該已經知道了(有很多HTML和C#的問題和答案)。所以雖然像HtmlAgilityPack這樣的東西絕對是一種好方法,但我認爲這應該作爲一個練習來創建正則表達式... –

回答

1

可以匹配的是採用這種regex,具有非固定寬度的外觀,背後的DIV標籤內(感謝.NET正則表達式引擎):

(?s)(?<=<div\s[^>]*?class=["']?important-contents["']?[^>]*?>).*?(?=</div>) 

然後,去除所有標籤,你可以使用this regex刪除匹配的DIV內容中的所有標籤:

</?[^>]+> 

要刪除<script>標記,可能會發現自己的方式向DIV標籤,下面我們來介紹另一步:

(?s)<script[^>]*?>.*?</script> 

我不知道匹配不連續文本的方法,因此只能在{2,}步驟中完成。

免責聲明:如果您的HTML格式不正確,您可能會得到更奇怪的結果,或者根本不匹配。

示例代碼:

var div_rgx = new Regex(@"(?si)(?<=<div\s[^>]*?class=[""']?important-contents[""']?[^>]*?>).*?(?=</div>)"); 
var tag_rgx = new Regex(@"</?[^>]+>"); 
var script_rgx = new Regex(@"(?s)<script[^>]*?>.*?</script>"); 
var txt = "<html>\r\n<body>\r\n<div class='important-contents'>\r\n<script>function getV(str) { return 0; }</script>\r\n<span>My <i>text</i><font face=\"Verdana\">.</font></span>\r\n</div>\r\n</body>\r\n</html>"; 
var result = div_rgx.Match(txt); 
if (result.Success) 
    var final = tag_rgx.Replace(script_rgx.Replace(result.Value, string.Empty), string.Empty).Trim(); 

輸出:

enter image description here

+0

如果div裏面有腳本塊,該怎麼辦? (我在我的日子裏看到過這種可怕的HTML,它不僅僅是爲了解決你的問題,像這樣的東西存在於互聯網上) –

+0

好的,我把這一步加到了答案上。 –

+0

感謝@stribizhev,但這隻顯示不在任何html標記中的內容。例如當'

Hello World
'它返回'Hello'而它應該返回'Hello World'。另外在'if(condition)'之後,當第一行聲明一個變量時有一個'{'。我編輯你的代碼如下:if(result.Success){var final = tag_rgx.Replace(script_rgx.Replace(result.Value,string.Empty),string.Empty).Trim();}' – Bellash

0

使用 「 '重要-內容'>」 作爲比賽,但沒有捕捉錨然後消耗的所有文字,直到<被擊中如

(?:'important-contents'\>)(?<Content>[^>]+) 

在上面我已將所有內容放入名爲「內容」的名稱匹配捕獲組中以便於提取。

0

首先,正則表達式是無法做到GET字符串不包含HTML標籤一般情況下,因爲HTML語法是不正規。你有兩個選擇:

  1. 使用完整的HTML解析器和工作與DOM(答案在這裏看到What is the best way to parse html in C#?例如)
  2. 放在任務一些權衡,例如 <div class='important-contents'>不會包含在內html標籤。在權衡解決方案案例可能是這樣的:

    var regex = `"<div class='important-contents'>(?<important>.*)</div>";` 
    MatchCollection matches = Regex.Matches(htmlString, regex); 
    foreach(Match m in matches){ 
        Console.WriteLine(m.Groups["important"].ToString()); 
    } 
    
+0

謝謝你的第一個解決方案!第二個不滿足...我會在你提供的鏈接中遵循建議 – Bellash

相關問題