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);
}
}
代碼中提供了兩種不同的方式來移除給定字符串中的HTML標(biāo)記,一個(gè)是使用正則表達(dá)式,一個(gè)是使用字符數(shù)組在for循環(huán)中進(jìn)行處理。來看一下測(cè)試的結(jié)果:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
const string html = "<p>There was a .NET 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ù)組來處理字符串。測(cè)試程序提供了1000個(gè)HTML文件,每個(gè)HTML文件中有大約8000個(gè)字符,所有的文件均通過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ù)組來處理大批量的文件時(shí)可以節(jié)省時(shí)間。在字符數(shù)組方法中,僅僅只是將非HTML標(biāo)記的字符添加到數(shù)組緩沖區(qū),為了提高效率,它使用字符數(shù)組和一個(gè)新的字符串構(gòu)造器來接收字符數(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á)式方法可能無法正確處理無效的HTML標(biāo)記。
Supported tags
<img src="" /> <img src=""/> <br /> <br/> < div > <!-- -->
HTML文檔中的注釋
  本文給出的代碼對(duì)移除HTML文檔注釋中的HTML標(biāo)記可能會(huì)失效。有些時(shí)候,注釋中可能會(huì)包含一些無效的HTML標(biāo)記,在處理時(shí)這些HTML標(biāo)記不會(huì)被完全移除。但是,掃描這些不正確的HTML標(biāo)記有時(shí)可能是必要的。
如何驗(yàn)證
  有許多種方法可以用來驗(yàn)證XHTML,我們可以采用和上面代碼相同的方式來進(jìn)行迭代。一個(gè)簡(jiǎn)單的方法是對(duì)'<'和'>'進(jìn)行計(jì)數(shù),從而確定它們是否匹配,或者采用正則表達(dá)式進(jìn)行匹配。這里有一些資源介紹了這些方法:
HTML Brackets: Validation
Validate XHTML
  有許多方法都可以用來去除給定字符串中的HTML標(biāo)記,它們返回的結(jié)果也都是正確的。毫無疑問,采用字符數(shù)組進(jìn)行迭代的效率最高。
以上所述是小編給大家介紹的C#使用for循環(huán)移除HTML標(biāo)記 ,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
上一篇:c# 計(jì)算時(shí)間間隔的簡(jiǎn)單方法(推薦)
欄 目:C#教程
下一篇:C#學(xué)習(xí)筆記- 隨機(jī)函數(shù)Random()的用法詳解
本文標(biāo)題:C#使用for循環(huán)移除HTML標(biāo)記
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6296.html
您可能感興趣的文章
- 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新聞效果的方法
 - 01-10C#實(shí)現(xiàn)Winform中打開網(wǎng)頁頁面的方法
 - 01-10winform實(shí)現(xiàn)創(chuàng)建最前端窗體的方法
 - 01-10WinForm實(shí)現(xiàn)自定義右下角提示效果的方法
 - 01-10.net2.0+ Winform項(xiàng)目實(shí)現(xiàn)彈出容器層
 - 01-10winform 實(shí)現(xiàn)控制輸入法
 - 01-10C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
 - 01-10C#3.0使用EventLog類寫Windows事件日志的方法
 


閱讀排行
- 1C語言 while語句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
 - 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
 - 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
 - 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
 - 01-10C#停止線程的方法
 - 01-10C#實(shí)現(xiàn)清空回收站的方法
 - 01-10C#通過重寫Panel改變邊框顏色與寬度的
 - 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
 
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 01-10C#中split用法實(shí)例總結(jié)
 - 04-02jquery與jsp,用jquery
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10delphi制作wav文件的方法
 - 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 


