其實刪除html文本中的註釋有很多方法,這裡就自己隨便寫了一個處理方法,權當筆記,有需要的同學可以參考。
html文本的註釋有幾個特點:
1. 成對出現,有開始就一定有結束。
2. 註釋標籤沒有嵌套,註釋開始標籤(以下稱為<!--)下一個一定是其對應的結束標籤(以下稱為-->)。
3. 一行中可能有多個註釋標籤對兒。
4. 註釋也可以換行。
大致有以下幾種情況:
複製代碼代碼如下:
<html>
<!--This is a head-->
<head>A Head</head>
<!--This is
a div -->
<div>A Div</div>
<!--This is
a span--><!--span in
a div--><div>a div</div>
<div><span>A span</span><div>
<!--This is a
span--><div>A div</div><!--span in a div-->
<div><span>A span</span><div>
<html>
思路:
1. 每次讀取一行文本。
2. 如果該行中只包含<!-- 與-->,並且<!-- 在--> 之前。直接刪除兩標籤之間的註釋內容,獲取其他內容。
3. 如果該行中只包含<!-- 與-->,但是<!-- 在--> 之後。獲取兩個標籤之間的內容,並且標註已遇到<!--標籤。
4. 如果該行中只包含<!--,獲取標籤前面的內容,並且標註已遇到<!--標籤。
5. 如果該行中只包含-->,獲取標籤後面的內容,並且標註已遇到--> 標籤。
6. 對該行剩下的內容再執行2,3,4,5步驟。
7. 保存剩下的內容。
8. 讀取下一行。
複製代碼代碼如下: public class HtmlCommentHandler {
/**
* html內容中註釋的Detector
*
* @author boyce
* @version 2013-12-3
*/
private static class HtmlCommentDetector {
private static final String COMMENT_START = "<!--";
private static final String COMMENT_END = "-->";
// 該字符串是否是html註釋行,包含註釋的開始標籤且結束標籤"<!-- -->"
private static boolean isCommentLine(String line) {
return containsCommentStartTag(line) && containsCommentEndTag(line)
&& line.indexOf(COMMENT_START) < line.indexOf(COMMENT_END);
}
// 是否包含註釋的開始標籤
private static boolean containsCommentStartTag(String line) {
return StringUtils.isNotEmpty(line) &&
line.indexOf(COMMENT_START) != -1;
}
// 是否包含註釋的結束標籤
private static boolean containsCommentEndTag(String line) {
return StringUtils.isNotEmpty(line) &&
line.indexOf(COMMENT_END) != -1;
}
/**
* 刪除該行中的註釋部分
*/
private static String deleteCommentInLine(String line) {
while (isCommentLine(line)) {
int start = line.indexOf(COMMENT_START) + COMMENT_START.length();
int end = line.indexOf(COMMENT_END);
line = line.substring(start, end);
}
return line;
}
// 獲取開始註釋符號之前的內容
private static String getBeforeCommentContent(String line) {
if (!containsCommentStartTag(line))
return line;
return line.substring(0, line.indexOf(COMMENT_START));
}
// 獲取結束註釋行之後的內容
private static String getAfterCommentContent(String line) {
if (!containsCommentEndTag(line))
return line;
return line.substring(line.indexOf(COMMENT_END) + COMMENT_END.length());
}
}
/**
* 讀取html內容,去掉註釋
*/
public static String readHtmlContentWithoutComment(BufferedReader reader) throws IOException {
StringBuilder builder = new StringBuilder();
String line = null;
// 當前行是否在註釋中
boolean inComment = false;
while (ObjectUtils.isNotNull(line = reader.readLine())) {
// 如果包含註釋標籤
while (HtmlCommentDetector.containsCommentStartTag(line) ||
HtmlCommentDetector.containsCommentEndTag(line)) {
// 將成對出現的註釋標籤之間的內容刪除
// <!-- comment -->
if (HtmlCommentDetector.isCommentLine(line)) {
line = HtmlCommentDetector.deleteCommentInLine(line);
}
// 如果不是註釋行,但是依然存在開始標籤和結束標籤,結束標籤一定在開始標籤之前
// xxx -->content<!--
else if (HtmlCommentDetector.containsCommentStartTag(line) && HtmlCommentDetector.containsCommentEndTag(line)) {
// 獲取結束標籤之後,開始標籤之前的文本,並且將inComment設置為true
line = HtmlCommentDetector.getAfterCommentContent(line);
line = HtmlCommentDetector.getBeforeCommentContent(line);
inComment = true;
}
// 如果只存在開始標籤,因為註釋標籤不支持嵌套,只有開始標籤的行一定不會inComment
// content <!--
else if (!inComment && HtmlCommentDetector.containsCommentStartTag(line)) {
// 將inComment 設置為true。獲取開始標籤之前的內容
inComment = true;
line = HtmlCommentDetector.getBeforeCommentContent(line);
}
// 如果只存在結束標籤,因為註釋標籤不支持嵌套,只有結束標籤的行一定inComment
// -->content
else if (inComment && HtmlCommentDetector.containsCommentEndTag(line)) {
// 將inComment 設置為false。獲取結束標籤之後的內容
inComment = false;
line = HtmlCommentDetector.getAfterCommentContent(line);
}
// 保存該行非註釋的內容
if (StringUtils.isNotEmpty(line))
builder.append(line);
}
// 保存該行不存在任何註釋標籤的並且inComment = false的行
if (StringUtils.isNotEmpty(line) && !inComment)
builder.append(line);
}
return builder.toString();
}
}
當然,還有其他很多的方法,也可以通過正則匹配刪除,也可以通過Stack標記開始結束。
等等,以上代碼經過測試使用,希望對有需要的同學有用。