public class HtmlCommentHandler {
/**
* html内容中注释的Detector
*
* @author boyce
* @version 2013-12-3
*/
private static class HtmlCommentDetector {
private static final String COMMENT_START = "";
// 该字符串是否是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)) {
// 将成对出现的注释标签之间的内容删除
//
if (HtmlCommentDetector.isCommentLine(line)) {
line = HtmlCommentDetector.deleteCommentInLine(line);
}
// 如果不是注释行,但是依然存在开始标签和结束标签,结束标签一定在开始标签之前
// xxx -->contentcontent
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();
}
}