実際、HTMLテキストでコメントを削除する方法はたくさんあります。
HTMLテキストにはコメントの特徴がいくつかあります。
1.ペアで表示される場合、開始すると終了します。
2。コメントタグはネストされておらず、コメント開始タグ(以下は<! - と呼ばれます)は、その対応するendタグ(以下 - >と呼ばれる)でなければなりません。
3.列に複数のコメントタグペアがある場合があります。
4。コメントも壊れる可能性があります。
ほぼ次の状況があります。
コードコピーは次のとおりです。
<html>
<! - これは頭です - >
<head>頭</head>
<! - これはです
div - >
<div> div </div>
<! - これはです
スパン - > <! - スパンイン
div - > <div> div </div>
<div> <span>スパン</span> <div>
<! - これはaです
span-> <div> a div </div> <! - span in a div->
<div> <span>スパン</span> <div>
<html>
アイデア:
1.一度に1行のテキストを読んでください。
2。行に<! - および - >のみが含まれている場合、<! - 。 2つのタグ間のコメントコンテンツを直接削除し、他のコンテンツを取得します。
3。行に< 2つのタグ間でコンテンツを取得すると、タグが<! - タグに遭遇しました。
4.行に<! - が含まれている場合、タグの前にコンテンツを取得し、タグが<! - タグに遭遇しました。
5.行にのみが含まれている場合 - >、タグの背後にあるコンテンツを取得すると、タグが - >タグに遭遇しました。
6。ラインの残りのコンテンツに対して2、3、4、および5ステップを実行します。
7.残りを保存します。
8。次の行を読んでください。
次のようにコードをコピーします:パブリッククラスhtmlcommenthandler {
/**
* HTMLコンテンツで注釈が付けられた検出器
*
* @Author Boyce
* @version 2013-12-3
*/
private static class htmlcommentdetector {
プライベート静的最終文字列comment_start = "<! - ";
プライベート静的最終文字列comment_end = " - >";
//この文字列アノテーションラインは注釈が付けられており、コメントの開始タグとエンドタグ「<! - >」
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){
Stringutils.isnotempty(line)&&を返します
line.indexof(comment_start)!= -1;
}
//注釈の終了タグを含めるかどうか
private static boolean containscommentendtag(string line){
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);
}
戻り回線;
}
//開始コメントシンボルの前にコンテンツを取得します
private static string getbeforecommentcontent(string line){
if(!containscommentStartTag(line))
戻り回線;
return line.substring(0、line.indexof(comment_start));
}
//エンドコメント行の後にコンテンツを取得します
private static string getaftercommentContent(string line){
if(!containscommentendtag(line))
戻り回線;
return line.substring(line.indexof(comment_end) + comment_end.length());
}
}
/**
* HTMLコンテンツを読んで、コメントを削除します
*/
public static string readhtmlcontentwithoutcomment(bufferedreader reader)throws ioexception {
stringbuilder builder = new StringBuilder();
文字列line = null;
//コメントの現在の行です
Boolean Incomment = false;
while(objectils.isnotnull(line = reader.readline())){
//コメントタグが含まれている場合
while(htmlcommentdetector.containscommentstarttag(line)||
htmlcommentdetector.containscommentEndtag(line)){
//ペアで表示されるコメントタグ間でコンテンツを削除します
// <! - コメント - >
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;
}
//コメントタグがネストをサポートしていないため、開始タグのみが存在する場合、開始タグのみを持つ行は間違いなく着信しません
// content <! -
else if(!incomment && htmlcommentdetector.containscommentstarttag(line)){
//入金をtrueに設定します。開始タグの前にコンテンツを取得します
Incomment = true;
line = htmlcommentdetector.getBeforeCommentContent(line);
}
//コメントタグがネストをサポートしていないため、エンドタグのみが存在する場合、エンドタグラインのみが着信しなければなりません
// - >コンテンツ
else if(incomment && htmlcommentdetector.containscommentendtag(line)){
// falseに着信を設定します。エンドタグの後にコンテンツを取得します
Incomment = false;
line = htmlcommentdetector.getaftercommentContent(line);
}
//この行の非接続コンテンツを保存します
if(stringutils.isnotempty(line))
Builder.Append(line);
}
//コメントにコメントタグなしで行を保存= false
if(stringutils.isnotempty(line)&&!decomment)
Builder.Append(line);
}
return builder.toString();
}
}
もちろん、他にも多くのメソッドがあります。これは、通常のマッチングで削除することもできます。また、スタックタグで起動して終了することもできます。
待ってください、上記のコードがテストされ、使用されています。困っている学生に役立つことを願っています。