2017-06-02 245 views
0

我試圖將一堆HTML文檔轉換爲符合XML規範(通過java方法),並且有很多<br>標籤,要麼(1)未封閉或(2)包含屬性。出於某種原因,我正在使用的正則表達式並未解決包含屬性的標籤。以下是代碼:試圖替換<br>,<BR>,<br />>>標籤與<br/>

htmlString = htmlString.replaceAll("(?i)<br *>", "<br/>"); 

此代碼適用於文檔中的所有<br>標籤;它用<br/>代替它們。然而,對於像

<BR style="PAGE-BREAK-BEFORE: always" clear=all> 

它不會做任何事情。不管標籤在轉換之前的屬性如何,我都希望所有br標籤都是<br/>

我需要添加到我的正則表達式才能實現這個目標?

回答

1

此正則表達式會做你想要的:<(BR|br)[^>]*>

這裏是一個工作示例:Regex101

1

你可能想<br\b[^>]*>以匹配

  • 開始<br
  • 有一句話,打破了所有的標籤後<br(這樣你就不會匹配<brown>標記,例如
  • 含任意數量的非>字符,包括0
  • >結尾
1

你必須使用.*而不是*

htmlString.replaceAll("(?i)<br .*>", "<br/>") 
//-----------------------------^^ 

因爲:

*匹配前面的字符或子表達式0次或更多次。

.*匹配任何字符零次或多次

因此,對於您的情況:

String htmlString = "<BR style=\"PAGE-BREAK-BEFORE: always\" clear=all>"; 
System.out.println(htmlString.replaceAll("(?i)<br .*>", "<br/>")); 

輸出

<br/> 
+0

'。*'不是一個好主意。這種模式會與'
Lorem ipsum dolor sit amet'? – VGR

0

使用正則表達式解析HTML是不是一個好主意,因爲HTML是不正規。您應該使用合適的解析庫,如NekoHTML

NekoHTML是一個簡單的HTML掃描儀和標籤平衡器,使 應用程序員來解析HTML文檔和訪問使用標準的XML接口 信息。解析器可以掃描HTML 文件並「修復」人類(和計算機)作者在編寫HTML文檔時所犯的許多常見錯誤。 NekoHTML添加缺失的父項 元素;用可選的結束標籤自動關閉元素;和 可以處理不匹配的行內元素標記。