2012-01-03 6 views
7

que tienen una cadena enviado por el usuario que contiene el contenido HTML comovacía, remover pares de etiquetas de fragmento de HTML

"<p></p><div></div><p>Hello<br/>world</p><p></p>" 

me gustaría transformar esta cadena de tal manera que pares de etiquetas vacías se eliminan (pero etiquetas vacías como <br/> se conservan). Por ejemplo, el resultado de esta transformación debe convertir la cadena de arriba para

"<p>Hello<br/>world</p>" 

Me gustaría utilizar JSoup de hacer esto, como ya tengo esto en mi ruta de clases, y sería más fácil para mí realice esta transformación en el lado del servidor.

Respuesta

21

Aquí es ejemplo, que hacer eso (usando JSoup):

String html = "<p></p><div></div><p>Hello<br/>world</p><p></p>"; 
Document doc = Jsoup.parse(html); 

for (Element element : doc.select("*")) { 
    if (!element.hasText() && element.isBlock()) { 
     element.remove(); 
    } 
} 

System.out.println(doc.body().html()) 

La salida del código anterior es lo que busca:

<p>Hello<br />world</p> 
+0

Ding, Ding, ding, tenemos un ganador !!! –

+0

Lo probé y el código de arriba imprime '

Hola
mundo

' –

+2

Me di cuenta de que este código elimina el img vacío dentro de un div ex:

así que también compruebo el tamaño vacío: && element.childNodes(). Size () == 0, ¿es correcta mi actualización? –

8
No

muy familiarizado con jsoup, pero se puede hacer esto con una simple expresión regular reemplazar:

String html = "<p></p><div></div><p>Hello<br/>world</p><p></p>"; 
html = html.replaceAll("<([^>]*)></\\1>", ""); 

Aunque con un analizador completo que probablemente podría simplemente dejar vacío de contenido durante el proceso, dependiendo de lo que está finalmente va a hacer con eso.

+0

replaceAll ("<[a-zA -Z0-9] *> "," "); puede verse mejor que permitir cualquier cosa que no sea> –

+0

Pero ¿qué pasa con Cursiva Negrita? Es un mal uso, pero sigue siendo legítimo. Creo que es necesario poder volver a emparejar exactamente lo que se usó en el primer conjunto de corchetes angulares. – FrankieTheKneeMan

+0

@PragalathanM, lo consideré, pero las etiquetas también permiten guiones, guiones bajos, etc. Una vez que comienzas a agregar todos esos caracteres, la afirmación comienza a parecer fea (y es posible que te pierdas algunos). –

0

si está utilizando jQuery, puede hacerlo como

var tags = "<p></p><div></div><p>Hello<br/>world</p><p></p>"; 

$("<div id='mydiv'>"+tags+"</div>").appendTo($('body')); 
$('#mydiv').children().each(function(){ 
    var elem = $(this); 
    if(elem.html() === "") elem.remove(); 
}); 

violín: http://jsfiddle.net/LqCx5/2/

+0

La función 'childrens' está generando un error. –

+0

actualizó la respuesta. Por favor revise, funciona bien, lo he probado en mi máquina. –

+0

Esto eliminará todas las etiquetas vacías, incluyendo

-2

no saben la Jsoup, por debajo de código también funciona con simples expresiones regulares javascript. intente el siguiente código.

function removeall(){ 
var tagarray=new Array("<p>","<div>"); 
source="<p></p><div></div><p>Hello<br/>world</p><p></p>"; 
for (var int = 0; int < tagarray.length; int++) { 
tag2=tagarray[int].replace("<","</"); 
var tagpair=new RegExp(tagarray[int]+tag2,"g"); 
source=source.replace(tagpair,""); 
    } 
alert(source); 

}