C#使用for循环移除HTML标记_C#教程

移除一段文字中的HTML标记,以消除其中包含的样式和段落等,最常用的办法可能就是正则表达式了。但是请注意,正则表达式并不能处理所有的HTML文档,所以有时采用一个迭代的方式会更好,如for循环。

看下面的代码:

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标记,一个是使用正则表达式,一个是使用字符数组在for循环中进行处理。来看一下测试的结果:

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));
}
}

  输出结果如下:

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.

  上述代码中分别调用了HtmlRemoval类中的三个不同的方法,均返回了相同的结果,即去除了给定字符串中的HTML标记。推荐使用第二种方法,即直接引用一个预先定义好的RegexOptions.Compiled的正则表达式对象,它比第一种方法速度更快。但是RegexOptions.Compiled有一些缺点,在某些情况下它的启动时间会增加数十倍。具体的内容可以查看下面这两篇文章:

RegexOption.Compiled
Regex Performance

  通常,正则表达式的执行效率并不是最高的,所以HtmlRemoval类中给定了另一种方法,使用字符数组来处理字符串。测试程序提供了1000个HTML文件,每个HTML文件中有大约8000个字符,所有的文件均通过File.ReadAllText方式进行读取,测试结果显示字符数组的方式执行速度是最快的。

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

  所以,使用字符数组来处理大批量的文件时可以节省时间。在字符数组方法中,仅仅只是将非HTML标记的字符添加到数组缓冲区,为了提高效率,它使用字符数组和一个新的字符串构造器来接收字符数组和范围,这个会比使用StringBuilder速度更快。

对于自关闭的HTML标记

  在XHTML中,某些标记并不具有独立的关闭标签,如<br/>,<img/>等。上述代码应该能够正确处理自关闭的HTML标记。下面是一些支持的HTML标记,注意,正则表达式方法可能无法正确处理无效的HTML标记。

Supported tags

<img src="" />
<img src=""/>
<br />
<br/>
< div >
<!-- -->

HTML文档中的注释

  本文给出的代码对移除HTML文档注释中的HTML标记可能会失效。有些时候,注释中可能会包含一些无效的HTML标记,在处理时这些HTML标记不会被完全移除。但是,扫描这些不正确的HTML标记有时可能是必要的。

如何验证

  有许多种方法可以用来验证XHTML,我们可以采用和上面代码相同的方式来进行迭代。一个简单的方法是对'<'和'>'进行计数,从而确定它们是否匹配,或者采用正则表达式进行匹配。这里有一些资源介绍了这些方法:

HTML Brackets: Validation

Validate XHTML

  有许多方法都可以用来去除给定字符串中的HTML标记,它们返回的结果也都是正确的。毫无疑问,采用字符数组进行迭代的效率最高。

以上所述是小编给大家介绍的C#使用for循环移除HTML标记 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
移除html标记
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-11-10 00:10:13

C#使用for循环移除HTML标记_C#教程的相关文章

C#使用foreach循环遍历数组完整实例_C#教程

本文实例讲述了C#使用foreach循环遍历数组的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //声明数组. 第一种方法. 声明并分配元素大小. int[] Myint

C#中除去所有在HTML元素中标记_C#教程

/// 除去所有在HTML元素中标记   public static string StripHTML(string strHtml)   {    string strOutput=strHtml;    Regex regex = new Regex(@"<[^>]+>|</[^>]+>");    strOutput = regex.Replace(strOutput,"");    return strOutput;   

重构——37移除控制标记(Remove Control Flag)

移除控制标记(Remove Control Flag) 在一系列表达式中,某个变量带有"控制标记作用":以break语句或者return语句取代控制标记 一.动机 单一出口的原则会大大降低代码的可读性 二.做法 1.找出让你跳出这段程序的控制标记值 2.找出对标记变量赋值的语句,代以恰当的break语句或continue语句 3.每次替换后,编译并测试 4.在未能提供break和continue的编程语言中 5.使用Extract Method,恰当的return

HTML网页列表标记学习教程

HTML网页列表标记学习教程. 在html页面中,列表可以起到提纲写领的作用.列表分为两种类型,一是有序列表,一是无序列表.前者用项目符号来标记无序的项目,而后者则使用编号来记录项目的顺序. 所谓有序,指的是按照数字或字母等顺序排列列表项目. 所谓无序,是指以●.○.□等开头的,没有顺序的列表项目. 关于列表的主要标记,如下表所示   标记 描述 <ul> 无序列表 <ol> 有序列表 <dir> 目录列表 <dl> 定义列表 <menu> 菜单

在Linux系统中使用dupeGuru查找并移除重复文件的教程

  简介 对我们来说,磁盘被装满是棘手问题之一.无论我们如何小心谨慎,我们总可能将相同的文件复制到多个不同的地方,或者在不知情的情况下,重复下载了同一个文件.因此,迟早你会看到"磁盘已满"的错误提示,若此时我们确实需要一些磁盘空间来存储重要数据,以上情形无疑是最糟糕的.假如你确信自己的系统中有重复文件,那么 dupeGuru 可能会帮助到你. dupeGuru 团队也开发了名为 dupeGuru 音乐版 的应用来移除重复的音乐文件,和名为 dupeGuru 图片版 的应用来移除重复的图

C#遍历集合与移除元素的方法_C#教程

本文实例讲述了C#遍历集合与移除元素的方法.分享给大家供大家参考,具体如下: 如果用foreach,会造成被遍历的集合更改后带来异常问题. 此时,用for循环可有效的解决这个问题. for(int i=0;i<List.Count;i++) { if(条件是真) { List.Remove(List[i]); i--; } } 或者,再用另外的一个List集合存储要删除的对象. List<T> newlists=new List<T>(); foreach(T t in Li

MySQL利用LOOP循环语句实现存储的方法教程

MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体介绍了. 今天我们先来看看LOOP循环 mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc()     -> BEGIN     ->     ->     DECLARE i int;   

asp do while 循环语法与do while实例教程

在do while循环的另一种常用后... Next循环的循环.在do while循环语句重复语句 块的次数不定.重复的陈述或者当条件为真或直到条件变为True.语法如下所示: Do [While|Until] condition   statements Loop Do    statements Loop [While|Until] condition 在这方面,这个循环内的代码将执行至少一次的情况.在有一个例子: 下面的例子定义了一个循环,开始与i = 0.循环将继续运行,因为我只要小于或

PhotoShop制作循环盛放的花朵GIF动画教程

教程教我们用PhotoShop制作循环盛放的花朵超炫GIF动画效果,主要用到变换工具来制作花朵,以及动画都有详细说明,喜欢的同学可以学习一下! 先看效果图: 1.打开ps新建300*300像素的文件,文件名随便填,如图点确定. 2.把图层1填充为黑色的背景,然后新建图层2,如图. 3.选中图层2,用椭圆工具拖一个正圆的选区,填充为红色,不要取消选区. 分类: PS入门教程