C#使用for循環(huán)移除HTML標(biāo)記
移除一段文字中的HTML標(biāo)記,以消除其中包含的樣式和段落等,最常用的辦法可能就是正則表達(dá)式了。但是請(qǐng)注意,正則表達(dá)式并不能處理所有的HTML文檔,所以有時(shí)采用一個(gè)迭代的方式會(huì)更好,如for循環(huán)。
看下面的代碼:
using System; using System.Text.RegularExpressions; /// <summary> /// Methods to remove HTML from strings. /// </summary> public static class HtmlRemoval { /// <summary> /// Remove HTML from string with Regex. /// </summary> public static string StripTagsRegex(string source) { return Regex.Replace(source, "<.*?>", string.Empty); } /// <summary> /// Compiled regular expression for performance. /// </summary> static Regex _htmlRegex = new Regex("<.*?>", RegexOptions.Compiled); /// <summary> /// Remove HTML from string with compiled Regex. /// </summary> public static string StripTagsRegexCompiled(string source) { return _htmlRegex.Replace(source, string.Empty); } /// <summary> /// Remove HTML tags from string using char array. /// </summary> public static string StripTagsCharArray(string source) { char[] array = new char[source.Length]; int arrayIndex = 0; bool inside = false; for (int i = 0; i < source.Length; i++) { char let = source[i]; if (let == '<') { inside = true; continue; } if (let == '>') { inside = false; continue; } if (!inside) { array[arrayIndex] = let; arrayIndex++; } } return new string(array, 0, arrayIndex); } }
代碼中提供了兩種不同的方式來(lái)移除給定字符串中的HTML標(biāo)記,一個(gè)是使用正則表達(dá)式,一個(gè)是使用字符數(shù)組在for循環(huán)中進(jìn)行處理。來(lái)看一下測(cè)試的結(jié)果:
using System; using System.Text.RegularExpressions; class Program { static void Main() { const string html = "<p>There was a <b>.NET</b> programmer " + "and he stripped the <i>HTML</i> tags.</p>"; Console.WriteLine(HtmlRemoval.StripTagsRegex(html)); Console.WriteLine(HtmlRemoval.StripTagsRegexCompiled(html)); Console.WriteLine(HtmlRemoval.StripTagsCharArray(html)); } }
輸出結(jié)果如下:
There was a .NET programmer and he stripped the HTML tags.
There was a .NET programmer and he stripped the HTML tags.
There was a .NET programmer and he stripped the HTML tags.
上述代碼中分別調(diào)用了HtmlRemoval類中的三個(gè)不同的方法,均返回了相同的結(jié)果,即去除了給定字符串中的HTML標(biāo)記。推薦使用第二種方法,即直接引用一個(gè)預(yù)先定義好的RegexOptions.Compiled的正則表達(dá)式對(duì)象,它比第一種方法速度更快。但是RegexOptions.Compiled有一些缺點(diǎn),在某些情況下它的啟動(dòng)時(shí)間會(huì)增加數(shù)十倍。具體的內(nèi)容可以查看下面這兩篇文章:
RegexOption.Compiled
Regex Performance
通常,正則表達(dá)式的執(zhí)行效率并不是最高的,所以HtmlRemoval類中給定了另一種方法,使用字符數(shù)組來(lái)處理字符串。測(cè)試程序提供了1000個(gè)HTML文件,每個(gè)HTML文件中有大約8000個(gè)字符,所有的文件均通過(guò)File.ReadAllText方式進(jìn)行讀取,測(cè)試結(jié)果顯示字符數(shù)組的方式執(zhí)行速度是最快的。
Performance test for HTML removal
HtmlRemoval.StripTagsRegex: 2404 ms
HtmlRemoval.StripTagsRegexCompiled: 1366 ms
HtmlRemoval.StripTagsCharArray: 287 ms [最快]
File length test for HTML removal
File length before: 8085 chars
HtmlRemoval.StripTagsRegex: 4382 chars
HtmlRemoval.StripTagsRegexCompiled: 4382 chars
HtmlRemoval.StripTagsCharArray: 4382 chars
所以,使用字符數(shù)組來(lái)處理大批量的文件時(shí)可以節(jié)省時(shí)間。在字符數(shù)組方法中,僅僅只是將非HTML標(biāo)記的字符添加到數(shù)組緩沖區(qū),為了提高效率,它使用字符數(shù)組和一個(gè)新的字符串構(gòu)造器來(lái)接收字符數(shù)組和范圍,這個(gè)會(huì)比使用StringBuilder速度更快。
對(duì)于自關(guān)閉的HTML標(biāo)記
在XHTML中,某些標(biāo)記并不具有獨(dú)立的關(guān)閉標(biāo)簽,如<br/>,<img/>等。上述代碼應(yīng)該能夠正確處理自關(guān)閉的HTML標(biāo)記。下面是一些支持的HTML標(biāo)記,注意,正則表達(dá)式方法可能無(wú)法正確處理無(wú)效的HTML標(biāo)記。
Supported tags
<img src="" /> <img src=""/> <br /> <br/> < div > <!-- -->
HTML文檔中的注釋
本文給出的代碼對(duì)移除HTML文檔注釋中的HTML標(biāo)記可能會(huì)失效。有些時(shí)候,注釋中可能會(huì)包含一些無(wú)效的HTML標(biāo)記,在處理時(shí)這些HTML標(biāo)記不會(huì)被完全移除。但是,掃描這些不正確的HTML標(biāo)記有時(shí)可能是必要的。
如何驗(yàn)證
有許多種方法可以用來(lái)驗(yàn)證XHTML,我們可以采用和上面代碼相同的方式來(lái)進(jìn)行迭代。一個(gè)簡(jiǎn)單的方法是對(duì)'<'和'>'進(jìn)行計(jì)數(shù),從而確定它們是否匹配,或者采用正則表達(dá)式進(jìn)行匹配。這里有一些資源介紹了這些方法:
HTML Brackets: Validation
Validate XHTML
有許多方法都可以用來(lái)去除給定字符串中的HTML標(biāo)記,它們返回的結(jié)果也都是正確的。毫無(wú)疑問(wèn),采用字符數(shù)組進(jìn)行迭代的效率最高。
以上所述是小編給大家介紹的C#使用for循環(huán)移除HTML標(biāo)記 ,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- C#中Foreach循環(huán)遍歷的本質(zhì)與枚舉器詳解
- C# 9.0新特性——擴(kuò)展方法GetEnumerator支持foreach循環(huán)
- c#中l(wèi)ist.FindAll與for循環(huán)的性能對(duì)比總結(jié)
- C#中foreach循環(huán)對(duì)比f(wàn)or循環(huán)的優(yōu)勢(shì)和劣勢(shì)
- 淺談C#中的for循環(huán)與foreach循環(huán)
- C# for循環(huán)的經(jīng)典案例集錦
- C# winform循環(huán)播放多個(gè)視頻
- c# for循環(huán)中創(chuàng)建線程執(zhí)行問(wèn)題
相關(guān)文章
C#實(shí)現(xiàn)繪制浮雕圖片效果實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)繪制浮雕圖片效果實(shí)例,是C#程序設(shè)計(jì)中非常實(shí)用的一個(gè)功能,需要的朋友可以參考下2014-08-08C# Winform實(shí)現(xiàn)截圖工具的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用C# Winform制作一個(gè)簡(jiǎn)單的截圖工具,從而實(shí)現(xiàn)截圖功能,文中的示例代碼講解詳細(xì),有需要的可以參考下2024-02-02解析OpenXml?Pptx的邊框虛線轉(zhuǎn)為WPF的邊框虛線問(wèn)題
這篇文章主要介紹了OpenXml?Pptx的邊框虛線轉(zhuǎn)為WPF的邊框虛線,在文中用PPTX的7種直線,分別設(shè)置7種能夠設(shè)置的虛線類型,具體實(shí)例代碼跟隨小編一起看看吧2021-12-12.NET C#利用ZXing生成、識(shí)別二維碼/條形碼
ZXing是一個(gè)開(kāi)放源碼的,用Java實(shí)現(xiàn)的多種格式的1D/2D條碼圖像處理庫(kù),它包含了聯(lián)系到其他語(yǔ)言的端口。這篇文章主要給大家介紹了.NET C#利用ZXing生成、識(shí)別二維碼/條形碼的方法,文中給出了詳細(xì)的示例代碼,有需要的朋友們可以參考借鑒。2016-12-12