Tatsächlich gibt es viele Möglichkeiten, Kommentare im HTML -Text zu löschen.
Es gibt mehrere Eigenschaften von Kommentaren zum HTML -Text:
1. Wenn es paarweise erscheint, wird es ein Ende geben, wenn es beginnt.
2. Das Kommentar-Tag ist nicht verschachtelt, und das Kommentarstart-Tag (im Folgenden als <!-) muss als nächstes sein entsprechendes End-Tag sein (im Folgenden bezeichnet als->).
3.. Es kann mehrere Kommentar -Tag -Paare in einer Zeile geben.
4. Kommentare können auch gebrochen werden.
Es gibt ungefähr die folgenden Situationen:
Die Codekopie lautet wie folgt:
<html>
<!-Das ist ein Kopf->
<Head> ein Kopf </head>
<!-das ist
ein div ->
<div> a div </div>
<!-das ist
Eine Spannweite-> <!-Spannweite
a div-> <div> a div </div>
<div> <span> a span </span> <div>
<!-das ist a
span-> <div> a div </div> <!-span in einem div->
<div> <span> a span </span> <div>
<html>
Ideen:
1. Lesen Sie jeweils eine Textzeile.
2. Wenn die Linie nur <!-und-> und vor <!-enthält. Löschen Sie den Kommentarinhalt direkt zwischen den beiden Tags und erhalten Sie andere Inhalte.
3. Wenn die Linie nur <!-und->, aber <!-nach-> enthält. Erhält den Inhalt zwischen den beiden Tags, und das Tag ist auf das <!- Tag begegnet.
4. Wenn die Zeile nur <!-, Holen Sie sich den Inhalt vor dem Tag, und das Tag ist auf das <!-Tag aufgetreten.
5. Wenn die Zeile nur -> enthält, erhalten Sie den Inhalt hinter dem Tag, und das Tag ist auf das -> Tag gestoßen.
6. Führen Sie 2, 3, 4 und 5 Schritte für den verbleibenden Inhalt der Linie aus.
7. Speichern Sie den Rest.
8. Lesen Sie die nächste Zeile.
Kopieren Sie den Code wie folgt: öffentliche Klasse htmlCommentHandler {
/**
* In HTML -Inhalte kommentiertes Detektor
*
* @author boyce
* @Version 2013-12-3
*/
private statische Klasse htmlCommentdetektor {
private statische endgültige Zeichenfolge comments_start = "<!-";
private statische endgültige Zeichenfolge comment_end = "->";
// Ist diese Zeichenfolge Annotation Zeile kommentiert, enthält das Start-Tag des Kommentars und das End-Tag "<!-->"
private statische boolean iscomportline (String -Linie) {
Return containsComputerStartTag (Zeile) && containsComentendTag (Zeile)
&& line.indexof (comment_start) <line.indexof (comment_end);
}
// ob das Start -Tag des Kommentars einbezogen werden soll
private static boolean enthält
return stringutils.isnotEmpty (Zeile) &&
line.indexof (comment_start)! = -1;
}
//, ob ein Annotation -End -Tag einbezogen werden soll
private static boolean enthält
return stringutils.isnotEmpty (Zeile) &&
line.indexof (comment_end)! = -1;
}
/**
* Löschen Sie die Kommentare in dieser Zeile
*/
private statische String -DeletecommentInline (String Line) {
while (isComentLine (Linie)) {
int start = line.indexof (comment_start) + comment_start.length ();
int End = line.indexof (comment_end);
line = line.substring (Start, Ende);
}
Rückkehrlinie;
}
// Erhalten Sie den Inhalt vor dem Start -Kommentar -Symbol
private statische Zeichenfolge GetBeForecommentContent (String Line) {
if (! containsCompmentStartTag (Linie))
Rückkehrlinie;
return line.substring (0, line.indexof (comment_start));
}
// Erhalten Sie den Inhalt nach der Endkommentarzeile
private statische Zeichenfolge GetAfterCommentContent (String Line) {
if (! containsCompmentendTag (Linie))
Rückkehrlinie;
return line.substring (line.indexof (comment_end) + comment_end.length ());
}
}
/**
* Lesen Sie den HTML -Inhalt und entfernen Sie die Kommentare
*/
public static String readhtmlContent MitoutComent (BufferedReader Reader) löst IoException {aus
StringBuilder Builder = new StringBuilder ();
String line = null;
// ist die aktuelle Zeile im Kommentar
boolescher Einkommen = falsch;
while (ObjectUtils.isnotnull (line = reader.readline ())) {
// Wenn das Kommentar -Tag enthalten ist
while (htmlCompomentDetektor.ContainsComentStartTag (Linie) ||
HtmlCommentDeTector.ContainsComentendTag (Linie)) {
// Löschen Sie den Inhalt zwischen den Kommentar -Tags, die paarweise erscheinen
// <!-Kommentar->
if (htmlCommentDeTector.isComentLine (Linie)) {
line = htmlComentDetektor.DeletcommentInline (Linie);
}
// Wenn es sich nicht um eine Kommentarlinie handelt, sondern das Startetikett und das Endetikett noch vorhanden ist, muss das Endetikett vor dem Startetikett vorhanden sein
// xxx-> Inhalt <!-
sonst if (htmlCommentDeTector
// Nach dem Erhalten des End -Tags wird der Text vor dem Startetik
line = htmlCommentDeTector.GetAfterCommentContent (Line);
line = htmlCommentdetektor.getBeForeComponentContent (Linie);
Einschluss = wahr;
}
// Wenn nur das Startetik
// Inhalt <!-
sonst if (! Incoment && htmlCommentDETECTOR.ContainsComentStartTag (Zeile)) {
// Einschränkung auf true festlegen. Holen Sie sich Inhalte vor dem Start -Tag
Einschluss = wahr;
line = htmlCommentdetektor.getBeForeComponentContent (Linie);
}
// Wenn nur das End -Tag vorhanden ist, da das Kommentar -Tag nicht die Verschachtelung unterstützt, müssen nur die End -Tag -Zeilen einkompliziert sein
// -> Inhalt
else wenn (Incoment && htmlCommentDETECTECTECTECE.ContainsComentendTag (Zeile)) {
// Einschränkung auf false festlegen. Holen Sie sich den Inhalt nach dem End -Tag
Einschluss = falsch;
line = htmlCommentDeTector.GetAfterCommentContent (Line);
}
// Speichern Sie den nicht gefährdeten Inhalt dieser Zeile
if (Stringutils.isnotEmpty (Linie)))
Builder.Append (Linie);
}
// Speichern Sie die Zeile ohne Kommentar -Tags in Kommentar = Falsch
if (Stringutils.isnotEmpty (Zeile) &&! Incoment)
Builder.Append (Linie);
}
return Builder.toString ();
}
}
Natürlich gibt es viele andere Methoden, die auch durch regelmäßige Übereinstimmung gelöscht werden können oder Sie mit Stack -Tag beginnen und enden können.
Warten Sie, der obige Code wurde getestet und verwendet, und ich hoffe, er wird für die Bedürftigen nützlich sein.