C#使用for循环移除HTML标记
作者:Jaxu 发布时间:2022-02-02 08:35:23
移除一段文字中的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标记 网站的支持!
来源:http://www.cnblogs.com/jaxu/p/3682042.html


猜你喜欢
- Feign调用中的两种Header传参方式在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,
- 如果还不知道DecorView,那也没有什么关系 ^_^先来看看实现的效果实现的大致思路首先需要明白什么是DecorView,他是andro
- 这篇文章主要介绍了Spring MVC处理方法返回值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 游戏介绍:拼图游戏是一款经典的益智游戏,游戏难度分为 简单、正常、困难 三种难度,分别对应3*3,4*4,5*5布局,游戏开始前图片被随机打
- 一、前言TreeView这个控件对于我来说是用得比较多的,以前做的小聊天软件(好友列表)、音乐播放器(播放列表)、类库展示器(树形类结构)等
- java 接口回调实例详解首先官方对接口回调的定义是这样的,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,
- 本文实例讲述了C#双向链表LinkedList排序实现方法。分享给大家供大家参考。具体如下:1.函数打印链表函数PrintLinkedLis
- 前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法:具体实例代码如下:public cl
- 本文实例讲述了在Linux上运行C#的方法。分享给大家供大家参考。具体方法如下:在任何一个平台(操作系统+硬件体系)上,编写和运行程序的三个
- 安卓验证码的简单实现我们经常在登录或者注册的时候要求输入验证码,这里简单介绍一下一种方法 效果如下首先是要获取 随机的四个字母组合,我这里是
- 效果图国际惯例,先看效果图:具体效果就是吃豆人会根据吃不同颜色的豆子改变身体的颜色。绘制静态吃豆人、豆豆、眼睛首先,我们需要将这个静态的吃豆
- 1 前言Java是近 10 年来计算机软件发展过程中的传奇,其在众多开发者心中的地位可谓“爱不释手”
- 本文实例讲述了C#使用smtp发送带附件的邮件实现方法。可直接将string类型结果保存为附件。分享给大家供大家参考。具体分析如下:该方式直
- 本文实例讲述了Java实现的微信公众号获取微信用户信息。分享给大家供大家参考,具体如下:注: 这里获取用户信息方式和网页授权获取
- 前言我采用的是Camera来实现自定义相机的,如果你使用的是Camera2,那本文将不适用你。为了减少篇幅,本文主要讲解手动对焦的实现方式,
- 简介happens-before是JMM的核心概念。理解happens-before是了解JMM的关键。1、设计意图JMM的设计需要考虑两个
- 一、枚举类类的对象只有有限个, 确定的. 我们称此类为枚举类.说明:1.类的对象只有有限个,确定的。如:星期:Monday(星期一)、…、S
- 线程池做什么网络请求通常有两种形式:第一种,请求不是很频繁,而且每次连接后会保持相当一段时间来读数据或者写数据,最后断开,如文件下载,网络流
- 本文为大家分享了AForge实现C#摄像头视频录制功能的具体方法,供大家参考,具体内容如下1. 概述最近由于兴趣学习了下在C#上使用AFor
- BeanFactory接口:IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对bean的创建,访问等工