移除一段文字中的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 removalHtmlRemoval.StripTagsRegex:         2404 ms
HtmlRemoval.StripTagsRegexCompiled: 1366 ms
HtmlRemoval.StripTagsCharArray:      287 ms [最快]
File length test for HTML removalFile 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标记,它们返回的结果也都是正确的。毫无疑问,采用字符数组进行迭代的效率最高。

本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/p/3682042.html,如需转载请自行联系原作者

C#移除HTML标记相关推荐

  1. html中for标记,C#使用for循环移除HTML标记

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

  2. 高德地图单点、多点标记,轨迹绘制,自定义标记覆盖物,给标记添加点击事件,移除所有标记和轨迹,轨迹回放功能

    文档地址 https://lbs.amap.com/api/javascript-api/guide/abc/prepare 注册 到官网注册一下就可以了https://lbs.amap.com/并创 ...

  3. Mac OS使用技巧之十三:Finder中标记的使用

    我们直入主题,在Mac系统中,我们可以为文件添加不同颜色.不同数量的标记来强调其重要性或者表示其种类 (现在说的标记,就是以前版本里面的标签,觉得没有以前版本的标记明显,好看)如下图: 一.如何添加标 ...

  4. 含HTML标记的内容分页 (C#)

    2009年3月27日23:52:20更新 最近网站要做静态生成内容必须分页所以在网上找了N多实例都不理想,所以花了点时间自己写了个方法 目前来说没发现什么问题(已用方法生成20W以上的html) 所以 ...

  5. html图层标记,图层标记和合成标记

    使用合成标记和图层标记可存储注释和其他元数据,以及标记合成或图层中的重要时刻.合成标记显示在合成的时间标尺上,而每个图层标记显示在相应图层的持续时间条上.两种标记都可以保存相同的信息. 标记可以指单个 ...

  6. 使用Python和OpenCV查找从摄像机到对象/标记的距离

    几天前,PyImageSearch读者Cameron通过电子邮件发送了邮件,询问了寻找从相机到图像中对象/标记之间距离的方法.他花了一些时间进行研究,但没有找到实现方案. 我确切地知道卡梅伦的感受.几 ...

  7. 高德地图api @amap/amap-jsapi-loader封装成方法(定位、点标记、路径规划、搜索等) 适用于vue等框架

    高德地图api 封装成公共方法用于项目中 目前封装的方法有 定位 点标记 比例尺插件 信息窗体 经纬度附近搜索 关键字搜索 交通路径规划(经纬度或地点名) 步行路径规划(经纬度或地点名) 经纬度获取地 ...

  8. LINUX下SVN命令大全

    1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:s ...

  9. 高德地图markevents_GitHub - mingxuWang/Map: 高德地图API二次封装

    Map组件设计文档 组件设计目的 分析当前各业务方向(销售端.商城.数据可视化.TMS)内地图相关应用的地图功能使用情况,封装Map组件供给各业务向进行使用. 将高德地图API进行二次封装,降低地图相 ...

最新文章

  1. 给VMware虚拟机增加硬盘容量:Linux/Windows系统
  2. java随机产生密码_用Java生成随机密码的方法
  3. 【渝粤教育】电大中专职业应用写作_1作业 题库
  4. oracle常用用户权限,oracle创建新用户及授予常用权限
  5. 03-22 H5 性能分析
  6. asterisk php agi,asterisk AMI入门
  7. nyoj1086是否被整除(数学小技巧)
  8. 完全平方数的几种判定方法与算法用时
  9. 奥克兰计算机科学专业世界排名,2021年度QS世界大学学科排名发布!奥克兰理工大学特色专业盘点...
  10. 从KMP到FSA有限状态自动机字符串匹配
  11. PostgreSQL 配置文件 postgresql.conf 及 postgresql.auto.conf
  12. 微信小程序,小游戏数据助手数据爬取!还敢随便授权小游戏吗?
  13. uva 10118(DP)
  14. 详细解读什么是自适应巡航?
  15. SAP S4 实施 会计科目表的实施方法论
  16. 解决 “已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭”
  17. 组件分享之后端组件——一个简单且高度可扩展的分布式文件系统seaweedfs
  18. Could not load file or assembly ‘office, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce11
  19. 【java获取路径】java 获取当前类的路径
  20. 基于.net mvc的校友录(四、系统结构图)

热门文章

  1. ASP.NET事件顺序
  2. 【连载】Django入门到实战(一)
  3. 微信小程序-上传多张图片加进度条(支持预览、删除)
  4. 基于 HTML5 Canvas 实现的文字动画特效
  5. SPOJ NSUBSTR(后缀自动机)
  6. exchange 2010申请分配证书服务提示:证书无效,不可用于exchange server
  7. 四个修改Docker默认存储位置的方法
  8. xpath NOT IE
  9. 常见错误:未能加载文件或程序集
  10. 诊断虚拟机频繁 OOM 的问题