[英]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%的時間內可靠地工作)。 盡管上面的解決方案在很多情況下都適用,但是請注意,它有一些局限性,並且有某些因素可以使它崩潰:
"<OBJECT...>"
開始或"</OBJECT>"
結束標記可能不會出現在任何CDATA
字符串中,例如SCRIPT或STYLE標記中,任何標記屬性中或任何HTML注釋中。 例如<p title="evil <OBJECT> attribute">
或<SCRIPT>alert("Bad <OBJECT> script here!");</SCRIPT>
或<!-- <OBJECT> inside a comment -->
。 <OBJECT>
開始標記的屬性中不得包含任何尖括號。 這些特殊情況應該很少見,上面的代碼對於大多數(即使不是全部)HTML文件也可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.