Java htmlテキストのコメント内容を削除する
最近のプロジェクトでは、外部htmlテキストファイルを読み込む機能があります.しかしhtmlファイルには多くのコメントがあり、そのコメントを削除して保存する必要があります.実はhtmlのテキストの中の注釈を削除するのは多くの方法があって、ここで自分で勝手に1つの処理方法を書いて、ノートになる権利があって、必要な学生は参考にすることができます.
htmlテキストの注釈にはいくつかの特徴があります.
1.ペアで現れ、始まりがあれば必ず終わりがある.
2.アノテーションラベルはネストされていません.アノテーション開始ラベル(以下、)です.
3.1行に複数のコメントラベルペアがある場合があります.
4.コメントは改行することもできます.
次のような状況があります.
考え方:
1.テキストを1行ずつ読み込みます.
2.行にの前に.2つのラベル間のコメント内容を直接削除し、他の内容を取得します.
3.行に、の後にあります.2つのラベルの間の内容を取得し、注記が4.行にのみが含まれている場合は、ラベルの後ろの内容を取得し、-->ラベルに遭遇したことをマークします.
6.行の残りの内容について、2,3,4,5のステップを実行します.
7.残りの内容を保存します.
8.次の行を読み込みます.
直接コード:
もちろん、他にもいろいろな方法がありますが、正則マッチングで削除したり、Stackタグで終了したりすることもできます.
など、以上のコードはテストして使用して、必要な学生に役に立つことを望んでいます.
htmlテキストの注釈にはいくつかの特徴があります.
1.ペアで現れ、始まりがあれば必ず終わりがある.
2.アノテーションラベルはネストされていません.アノテーション開始ラベル(以下、)です.
3.1行に複数のコメントラベルペアがある場合があります.
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.テキストを1行ずつ読み込みます.
2.行にの前に.2つのラベル間のコメント内容を直接削除し、他の内容を取得します.
3.行に、の後にあります.2つのラベルの間の内容を取得し、注記が4.行にのみが含まれている場合は、ラベルの後ろの内容を取得し、-->ラベルに遭遇したことをマークします.
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タグで終了したりすることもできます.
など、以上のコードはテストして使用して、必要な学生に役に立つことを望んでいます.