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小時內與您取得聯系。