C#使用for循环移除HTML标记
移除一段文字中的HTML标记,以消除其中包含的样式和段落等,最常用的办法可能就是正则表达式了。但是请注意,正则表达式并不能处理所有的HTML文档,所以有时采用一个迭代的方式会更好,如for循环。
看下面的代码:
usingSystem; usingSystem.Text.RegularExpressions; ///<summary> ///MethodstoremoveHTMLfromstrings. ///</summary> publicstaticclassHtmlRemoval { ///<summary> ///RemoveHTMLfromstringwithRegex. ///</summary> publicstaticstringStripTagsRegex(stringsource) { returnRegex.Replace(source,"<.*?>",string.Empty); } ///<summary> ///Compiledregularexpressionforperformance. ///</summary> staticRegex_htmlRegex=newRegex("<.*?>",RegexOptions.Compiled); ///<summary> ///RemoveHTMLfromstringwithcompiledRegex. ///</summary> publicstaticstringStripTagsRegexCompiled(stringsource) { return_htmlRegex.Replace(source,string.Empty); } ///<summary> ///RemoveHTMLtagsfromstringusingchararray. ///</summary> publicstaticstringStripTagsCharArray(stringsource) { char[]array=newchar[source.Length]; intarrayIndex=0; boolinside=false; for(inti=0;i<source.Length;i++) { charlet=source[i]; if(let=='<') { inside=true; continue; } if(let=='>') { inside=false; continue; } if(!inside) { array[arrayIndex]=let; arrayIndex++; } } returnnewstring(array,0,arrayIndex); } }
代码中提供了两种不同的方式来移除给定字符串中的HTML标记,一个是使用正则表达式,一个是使用字符数组在for循环中进行处理。来看一下测试的结果:
usingSystem; usingSystem.Text.RegularExpressions; classProgram { staticvoidMain() { conststringhtml="<p>Therewasa<b>.NET</b>programmer"+ "andhestrippedthe<i>HTML</i>tags.</p>"; Console.WriteLine(HtmlRemoval.StripTagsRegex(html)); Console.WriteLine(HtmlRemoval.StripTagsRegexCompiled(html)); Console.WriteLine(HtmlRemoval.StripTagsCharArray(html)); } }
输出结果如下:
Therewasa.NETprogrammerandhestrippedtheHTMLtags.
Therewasa.NETprogrammerandhestrippedtheHTMLtags.
Therewasa.NETprogrammerandhestrippedtheHTMLtags.
上述代码中分别调用了HtmlRemoval类中的三个不同的方法,均返回了相同的结果,即去除了给定字符串中的HTML标记。推荐使用第二种方法,即直接引用一个预先定义好的RegexOptions.Compiled的正则表达式对象,它比第一种方法速度更快。但是RegexOptions.Compiled有一些缺点,在某些情况下它的启动时间会增加数十倍。具体的内容可以查看下面这两篇文章:
RegexOption.Compiled
RegexPerformance
通常,正则表达式的执行效率并不是最高的,所以HtmlRemoval类中给定了另一种方法,使用字符数组来处理字符串。测试程序提供了1000个HTML文件,每个HTML文件中有大约8000个字符,所有的文件均通过File.ReadAllText方式进行读取,测试结果显示字符数组的方式执行速度是最快的。
PerformancetestforHTMLremoval
HtmlRemoval.StripTagsRegex:2404ms
HtmlRemoval.StripTagsRegexCompiled:1366ms
HtmlRemoval.StripTagsCharArray:287ms[最快]
FilelengthtestforHTMLremoval
Filelengthbefore:8085chars
HtmlRemoval.StripTagsRegex:4382chars
HtmlRemoval.StripTagsRegexCompiled:4382chars
HtmlRemoval.StripTagsCharArray:4382chars
所以,使用字符数组来处理大批量的文件时可以节省时间。在字符数组方法中,仅仅只是将非HTML标记的字符添加到数组缓冲区,为了提高效率,它使用字符数组和一个新的字符串构造器来接收字符数组和范围,这个会比使用StringBuilder速度更快。
对于自关闭的HTML标记
在XHTML中,某些标记并不具有独立的关闭标签,如<br/>,<img/>等。上述代码应该能够正确处理自关闭的HTML标记。下面是一些支持的HTML标记,注意,正则表达式方法可能无法正确处理无效的HTML标记。
Supportedtags
<imgsrc=""/> <imgsrc=""/> <br/> <br/> <div> <!---->
HTML文档中的注释
本文给出的代码对移除HTML文档注释中的HTML标记可能会失效。有些时候,注释中可能会包含一些无效的HTML标记,在处理时这些HTML标记不会被完全移除。但是,扫描这些不正确的HTML标记有时可能是必要的。
如何验证
有许多种方法可以用来验证XHTML,我们可以采用和上面代码相同的方式来进行迭代。一个简单的方法是对'<'和'>'进行计数,从而确定它们是否匹配,或者采用正则表达式进行匹配。这里有一些资源介绍了这些方法:
HTMLBrackets:Validation
ValidateXHTML
有许多方法都可以用来去除给定字符串中的HTML标记,它们返回的结果也都是正确的。毫无疑问,采用字符数组进行迭代的效率最高。
以上所述是小编给大家介绍的C#使用for循环移除HTML标记,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!