的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文件應該很好。
你爲什麼要刪除它?你是否考慮過不要把它放在第一位(例如服務器端)呢? – 2011-03-22 09:42:00
實際上這個內容在DB堅持,所以我不得不在屋裏刪除這些內容,包括
原則上,每個HTML用戶代理應該忽略'