De fato, existem muitas maneiras de excluir comentários no texto HTML.
Existem várias características dos comentários sobre o texto HTML:
1. Se aparecer em pares, haverá um fim se iniciar.
2. A tag de comentário não está aninhada e a tag de início do comentário (a seguir denominada tag correspondente (a seguir referido como->).
3. Pode haver vários pares de tags de comentários em uma linha.
4. Os comentários também podem ser quebrados.
Existem aproximadamente as seguintes situações:
A cópia do código é a seguinte:
<html>
<!-esta é uma cabeça->
<head> Uma cabeça </ad Head>
<!-isso é
a div ->
<div> Um div </div>
<!-isso é
um span-> <!-span in
a div-> <div> a div </div>
<div> <pan> um span </span> <div>
<!-Isso é a
span-> <div> a div </div> <!-abrange em uma div->
<div> <pan> um span </span> <div>
<html>
Ideias:
1. Leia uma linha de texto por vez.
2. Se a linha contiver apenas <!-e-> e antes <!-. Exclua diretamente o conteúdo do comentário entre as duas tags e obtenha outro conteúdo.
3. Se a linha contiver apenas <!-e->, mas <!-depois->. Obtém o conteúdo entre as duas tags e a tag encontrou a tag <!-.
4. Se a linha contiver apenas <!-, obtenha o conteúdo antes da tag e a tag encontrou a tag <!-.
5. Se a linha contiver apenas ->, obtenha o conteúdo por trás da tag e a tag encontrou a tag ->.
6. Execute 2, 3, 4 e 5 etapas para o conteúdo restante da linha.
7. salve o resto.
8. Leia a próxima linha.
Copie o código da seguinte forma: classe pública htmlcommentHandler {
/**
* Detector anotado no conteúdo HTML
*
* @Author Boyce
* @Version 2013-12-3
*/
classe estática privada htmlCommentDetector {
String final estática privada comentário_start = "<!-";
String final estática privada comentário_end = "->";
// Esta linha de anotação de string está anotada, contém a tag de início do comentário e a etiqueta final "<!-->"
private estático booleano iscommentline (linha de string) {
o retorno containscommentstartTag (line) && containscommentEndTag (linha)
&& line.indexof (comentário_start) <line.indexof (comentário_end);
}
// se deve incluir a tag de início do comentário
Private estático booleano
retornar stringutils.isnotEmpty (linha) &&
line.indexOF (comentário_start)! = -1;
}
// se deve incluir uma etiqueta final de anotação
Private estático booleano
retornar stringutils.isnotEmpty (linha) &&
line.indexOf (comentário_end)! = -1;
}
/**
* Exclua os comentários nesta linha
*/
String estática privada DeleteCommentInline (linha de string) {
while (IsCommentLine (Line)) {
int start = line.indexof (comentário_start) + comentário_start.length ();
int end = line.indexof (comentário_end);
line = line.substring (start, end);
}
linha de retorno;
}
// Obtenha o conteúdo antes do símbolo de comentário inicial
String estática privada getBeForecommentContent (linha de string) {
if (! containscommentstartTag (linha))
linha de retorno;
Return line.substring (0, line.indexOF (comentário_start));
}
// Obtenha o conteúdo após a linha de comentário final
String estática privada getAfterCommentContent (linha de string) {
if (! containscommentEndTag (linha))
linha de retorno;
Return line.substring (line.indexOF (comentário_end) + comentário_end.length ());
}
}
/**
* Leia o conteúdo HTML e remova os comentários
*/
public static string readhtmlContentWithoutComment (BufferredReader Reader) lança ioexception {
StringBuilder Builder = new StringBuilder ();
Linha de string = null;
// é a linha atual no comentário
INCOMENTO BOOLEANS = FALSE;
while (objectUtils.isnotNull (line = reader.readline ())) {
// se a tag de comentário estiver incluída
while (htmlCommentDeTector.ContainscommentStartTag (Line) ||
HtmlCommentDetector.ContainscomMentEndTag (Linha)) {
// Exclua o conteúdo entre as tags de comentários que aparecem em pares
// <!-Comentário->
if (htmlCommentDeTector.iscommentLine (line)) {
linha = htmlCommentDeTector.deleteCommentinline (linha);
}
// Se não for uma linha de comentários, mas o rótulo inicial e o rótulo final ainda existem, o rótulo final deve estar antes do rótulo inicial
// xxx-> conteúdo <!-
caso contrário, if (htmlCommentDeTector.ContainscommentStartTag (Line) && htmlCommentDetector.ContainscomMentEndTag (Line)) {
// Depois de obter a etiqueta final, o texto antes da tag de início é definido e definido
linha = htmlCommentDeTector.getAfterCommentContent (linha);
linha = htmlCommentDeTector.getBeforeCommentContent (linha);
INCOMENTO = TRUE;
}
// Se apenas a tag de início existir, porque a tag de comentário não suporta o ninho, as linhas com apenas a tag de início definitivamente não serão
// conteúdo <!-
caso contrário, se (!
// Defina o incomento como true. Obtenha conteúdo antes da tag de início
INCOMENTO = TRUE;
linha = htmlCommentDeTector.getBeforeCommentContent (linha);
}
// Se apenas a etiqueta final existir, porque a etiqueta de comentário não suporta o ninho, apenas as linhas de tags devem ser incorrentes
// -> Conteúdo
caso contrário, if (Incomment && htmlCommentDeTector.ContainsComMentendTag (Line)) {
// Defina o incomento como falso. Obtenha o conteúdo após a etiqueta final
INCOMENTO = FALSO;
linha = htmlCommentDeTector.getAfterCommentContent (linha);
}
// salvar o conteúdo não contratado desta linha
if (stringutils.isnotEmpty (linha))
construtor.append (linha);
}
// salve a linha sem tags de comentário em comentário = false
if (stringutils.isnotEmpty (line) &&! Incomment)
construtor.append (linha);
}
retornar construtor.toString ();
}
}
Obviamente, existem muitos outros métodos, que também podem ser excluídos por meio de correspondência regular, ou você pode começar e terminar com a tag de pilha.
Espere, o código acima foi testado e usado, e espero que seja útil para os alunos necessitados.