簡體   English   中英

如何使用Java從我的HTML中刪除對象標簽

[英]How to remove the object tag from my HTML using Java

嗨,我正在嘗試使用Java從HTML內容中刪除對象標簽,以便可以在不支持Flash的設備中呈現HTML。

<object classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50">
  <param name="BorderStyle" value="1" />
  <param name="MousePointer" value="0" />
  <param name="Enabled" value="1" />
  <param name="Min" value="0" />
  <param name="Max" value="10" />
</object>

這個正則表達式必須達到目的:

<\/?object(\s\w+(\=\".*\")?)*\>

您可以只使用Tagsoup(http://ccil.org/~cowan/XML/tagsoup/),這是一個XML解析器,即使格式不正確也可以從html讀取(不需要是xhtml甚至不需要遵循) 。

然后,您可以只使用xpath刪除所有對象標簽。

這比正則表達式安全得多,如果您想掌握所有邊緣情況,則很難維護。

OBJECT HTML元素可以嵌套。 由於Java不提供本地正則表達式遞歸表達式,因此您不能直接將最外部的OBJECT元素與單個正則表達式匹配。 但是,您可以設計正則表達式以匹配最里面的 OBJECT元素,然后進行迭代,從“由內而外”替換它們,直到沒有剩余為止。 這是一個經過測試的Java代碼段,它精確地做到了:

String regex = "<object\\b[^>]*>[^<]*(?:(?!</?object\\b)<[^<]*)*</object\\s*>";
String resultString = null;
java.util.regex.Pattern p = java.util.regex.Pattern.compile(
            regex,
            java.util.regex.Pattern.CASE_INSENSITIVE |
            java.util.regex.Pattern.UNICODE_CASE);
java.util.regex.Matcher m = p.matcher(subjectString);
while (m.find())
{ // Iterate until there are no OBJECT elements.
    resultString = m.replaceAll("");
    m = p.matcher(resultString);
}
System.out.println(resultString);

洞穴:無疑會有很多人指出: “您不能使用正則表達式來解析HTML!” 並且它們是正確的(如果您的解決方案必須在100%的時間內可靠地工作)。 盡管上面的解決方案在很多情況下都適用,但是請注意,它有一些局限性,並且有某些因素可以使它崩潰:

  1. "<OBJECT...>"開始或"</OBJECT>"結束標記可能不會出現在任何CDATA字符串中,例如SCRIPT或STYLE標記中,任何標記屬性中或任何HTML注釋中。 例如<p title="evil <OBJECT> attribute"><SCRIPT>alert("Bad <OBJECT> script here!");</SCRIPT><!-- <OBJECT> inside a comment -->
  2. <OBJECT>開始標記的屬性中不得包含任何尖括號。

這些特殊情況應該很少見,上面的代碼對於大多數(即使不是全部)HTML文件也可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM