C#移除HTML标记
移除一段文字中的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标记相关推荐
- html中for标记,C#使用for循环移除HTML标记
移除一段文字中的HTML标记,以消除其中包含的样式和段落等,最常用的办法可能就是正则表达式了.但是请注意,正则表达式并不能处理所有的HTML文档,所以有时采用一个迭代的方式会更好,如for循环. 看下 ...
- 高德地图单点、多点标记,轨迹绘制,自定义标记覆盖物,给标记添加点击事件,移除所有标记和轨迹,轨迹回放功能
文档地址 https://lbs.amap.com/api/javascript-api/guide/abc/prepare 注册 到官网注册一下就可以了https://lbs.amap.com/并创 ...
- Mac OS使用技巧之十三:Finder中标记的使用
我们直入主题,在Mac系统中,我们可以为文件添加不同颜色.不同数量的标记来强调其重要性或者表示其种类 (现在说的标记,就是以前版本里面的标签,觉得没有以前版本的标记明显,好看)如下图: 一.如何添加标 ...
- 含HTML标记的内容分页 (C#)
2009年3月27日23:52:20更新 最近网站要做静态生成内容必须分页所以在网上找了N多实例都不理想,所以花了点时间自己写了个方法 目前来说没发现什么问题(已用方法生成20W以上的html) 所以 ...
- html图层标记,图层标记和合成标记
使用合成标记和图层标记可存储注释和其他元数据,以及标记合成或图层中的重要时刻.合成标记显示在合成的时间标尺上,而每个图层标记显示在相应图层的持续时间条上.两种标记都可以保存相同的信息. 标记可以指单个 ...
- 使用Python和OpenCV查找从摄像机到对象/标记的距离
几天前,PyImageSearch读者Cameron通过电子邮件发送了邮件,询问了寻找从相机到图像中对象/标记之间距离的方法.他花了一些时间进行研究,但没有找到实现方案. 我确切地知道卡梅伦的感受.几 ...
- 高德地图api @amap/amap-jsapi-loader封装成方法(定位、点标记、路径规划、搜索等) 适用于vue等框架
高德地图api 封装成公共方法用于项目中 目前封装的方法有 定位 点标记 比例尺插件 信息窗体 经纬度附近搜索 关键字搜索 交通路径规划(经纬度或地点名) 步行路径规划(经纬度或地点名) 经纬度获取地 ...
- LINUX下SVN命令大全
1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:s ...
- 高德地图markevents_GitHub - mingxuWang/Map: 高德地图API二次封装
Map组件设计文档 组件设计目的 分析当前各业务方向(销售端.商城.数据可视化.TMS)内地图相关应用的地图功能使用情况,封装Map组件供给各业务向进行使用. 将高德地图API进行二次封装,降低地图相 ...
最新文章
- 给VMware虚拟机增加硬盘容量:Linux/Windows系统
- java随机产生密码_用Java生成随机密码的方法
- 【渝粤教育】电大中专职业应用写作_1作业 题库
- oracle常用用户权限,oracle创建新用户及授予常用权限
- 03-22 H5 性能分析
- asterisk php agi,asterisk AMI入门
- nyoj1086是否被整除(数学小技巧)
- 完全平方数的几种判定方法与算法用时
- 奥克兰计算机科学专业世界排名,2021年度QS世界大学学科排名发布!奥克兰理工大学特色专业盘点...
- 从KMP到FSA有限状态自动机字符串匹配
- PostgreSQL 配置文件 postgresql.conf 及 postgresql.auto.conf
- 微信小程序,小游戏数据助手数据爬取!还敢随便授权小游戏吗?
- uva 10118(DP)
- 详细解读什么是自适应巡航?
- SAP S4 实施 会计科目表的实施方法论
- 解决 “已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭”
- 组件分享之后端组件——一个简单且高度可扩展的分布式文件系统seaweedfs
- Could not load file or assembly ‘office, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce11
- 【java获取路径】java 获取当前类的路径
- 基于.net mvc的校友录(四、系统结构图)