HTML文本中移除所有HTML标记并提取纯文本是我们经常需要使用的文本内容处理方式,比如搜索引擎、网站爬虫或者本地文档检索系统需要提取网页或HTML文档的实际内容进行索引。通过去除HTML标签,可以专注于实际的文字信息,提高搜索结果的相关性和准确性。在新闻聚合应用或社交媒体平台上展示网页链接的摘要时,通常会提取并显示纯文本内容以提供简洁的预览。对于视觉障碍人士使用的辅助技术如屏幕阅读器,它们无法解析复杂的HTML结构,因此需要提取纯文本以便朗读给用户。所以今天给大家分享一个使用正则表达式移除所有的Html标记的方法,供有需要的朋友们参考:
第一个核心代码是:正则表达式"<.*?>"
// 示例用法:
string inputHtml = "<html><body><h1>Hello, World!</h1>This is a <b>test</b>.</body></html>";
string plainText = RemoveHtmlTags(inputHtml);
Console.WriteLine(plainText); // 输出: "Hello, World!This is a test."
public static string RemoveHtmlTags(string html)
{
// 正则表达式用于匹配HTML标签
Regex regex = new Regex("<.*?>", RegexOptions.Singleline | RegexOptions.Compiled);
// 使用正则表达式的Replace方法移除所有匹配的HTML标签
string result = regex.Replace(html, String.Empty);
return result;
}
这个正则表达式<.*?>是非贪婪匹配任何以 < 开始、以 > 结束的字符串,它会尽可能少地匹配字符以找到每个HTML标签。
请注意,虽然此方法对于简单场景可能有效,但对复杂的HTML文档(特别是含有嵌套标签、注释、CDATA等内容)可能不够健壮,因为它无法处理所有可能的HTML结构。
第二个核心代码是:正则表达式"<[^>]*>"
public static string ExtractPlainTextFromHtml(string html)
{
// 使用正则表达式匹配所有的HTML标签
// 注意:这个简单的正则表达式适用于大多数基础HTML结构,但可能无法处理复杂嵌套或特殊格式的HTML
Regex regex = new Regex("<[^>]*>", RegexOptions.Singleline | RegexOptions.Compiled);
// 使用Replace方法去除所有匹配到的HTML标签,并返回纯文本内容
string plainText = regex.Replace(html, String.Empty);
return plainText.Trim(); // 为了得到更整洁的结果,可以对结果进行trim操作以去除多余的空白字符
}
在这段代码中,我们定义了一个名为ExtractPlainTextFromHtml的方法,该方法利用正则表达式 <[^>]*> 来查找并替换所有HTML标签。这里的正则表达式表示任何以 < 开始、以 > 结束的非空字符串(即HTML标签),Singleline 选项使.能匹配换行符,以便跨多行搜索标签,而 Compiled 选项则是为了优化正则表达式的性能。
第二个核心代码是:正则表达式"<[^>]*>"
public static string RemoveHtmlTags(string html)
{
// 正则表达式,匹配所有HTML标签
string pattern = "<[^>]+>";
// 使用Regex.Replace方法移除所有匹配的HTML标签
return Regex.Replace(html, pattern, String.Empty);
}
请注意,此方法仅移除HTML标记,不会解析或处理嵌入在HTML中的JavaScript代码或其他非标记内容。此外,此方法也无法处理不规范或不符合预期格式的HTML标记。如果需要更复杂的HTML解析或清理,您可能需要使用专门的HTML解析库,如AngleSharp或HtmlAgilityPack等。
尽管上述方法对于许多简单场景已经足够有效,但在面对复杂的HTML文档时,由于HTML本身的嵌套和特殊结构,简单的正则表达式可能无法完美地解析并移除所有标签。在这种情况下,推荐使用专门为处理HTML设计的库,如HtmlAgilityPack,它可以准确地解析HTML并提供丰富的API用于提取纯文本内容。
过上一章的内容,现在网页文件中,我们还须要去除的就是html代码了。
下面我们要研究一下html代码的主要特点,不管什么样的HTML代码,他们均被左右尖括号所包围,就像这个样子<代码>,因此,我们就有了去除的方法,把括号中的内容和联通括号一起去除掉,就可以了。
下面开始,根据我们的想法,可以写出,下面这样的主程序
看上图,再上一张定义的函数,我们把它移动到了通用函数库中
第21行,这是我们新增的代码,执行完这个代码,就去除掉了HTML标记,剩下的就应该是纯文字内容了。在这里,我们定义了一个函数,名字叫做去除html代码。
下面我们研究一下,这个函数的内容,如下图
因为使用了正则表达式,因此,在程序运行前,必须导入模块re
第3行,导入我们所需要的re模块,我们想用到正则表达式
第5行,定义函数
第6行,用右尖括号分格隔成列表
第8行,对列表元素进行遍历
第9行,使用正则挑出有效的内容,其实就是去除以前孤立的右尖括号的内容。
第10行,对有效的内容进行左尖括号分隔
第11行,左尖括号前面的内容就是有效的文字内容
完整的程序如下
下面我们对程序进行下测试,在上一章中,程序运行后得到如下的内容(内容太长,只截取一小部分)
本次程序改造后,运行得到下面的内容
从上面两个图片可以看出,我们确实把文字内容提取出来了。
.处理前需要进入架包
<dependency>
<groupId>net.htmlparser.jericho</groupId>
<artifactId>jericho-html</artifactId>
<version>3.2</version>
</dependency>
2.工具类:
public static String getPlainTextWithoutHtmlTag(String content) {
if(content == null || "".equals(content)){
return "";
}else{
Source src = new Source(content);
String str = src.getTextExtractor().toString().trim();
return str.replaceAll(" ","").replaceAll(" ", "");
}
}
3.例子
处理前:<p style="text-align:left;">
王某某,副主任医师,上海中医药大学博士,南京军区南京总医院肾脏病研究所博士后,全国第四批名老中医学术继承人。擅长中西医结合治疗肾内科疾病,对各种原发性和继发性肾小球疾病的病理诊断与临床治疗、以及中早期慢性肾功能衰竭的“一体化”治疗积累了丰富经验,尤其对糖尿病肾病、<span>IgA</span><span>肾病、膜性肾病、狼疮性肾炎、局灶节段性肾小球硬化症、肥胖相关性肾病等疾病进行了深入研究。近年来发表学术论文十余篇,主持、参与科研课题五项。</span>
</p>
<p>
<br />
</p>
处理后:王某某,副主任医师,上海中医药大学博士,南京军区南京总医院肾脏病研究所博士后,全国第四批名老中医学术继承人。擅长中西医结合治疗肾内科疾病,对各种原发性和继发性肾小球疾病的病理诊断与临床治疗、以及中早期慢性肾功能衰竭的“一体化”治疗积累了丰富经验,尤其对糖尿病肾病、IgA肾病、膜性肾病、狼疮性肾炎、局灶节段性肾小球硬化症、肥胖相关性肾病等疾病进行了深入研究。近年来发表学术论文十余篇,主持、参与科研课题五项。
大家可关注我的博客,一起交流学习
原文:https://blog.csdn.net/weixin_42720002/article/details/91510797
*请认真填写需求信息,我们会在24小时内与您取得联系。