Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con la eliminación de contenidos entre etiquetas

Estas en el tema de Problema con la eliminación de contenidos entre etiquetas en el foro de Java en Foros del Web. Hola a todos Hacía mucho tiempo que no iniciaba un post aquí, pero hoy necesito vuestra ayuda. Resulta que tengo que filtrar unas etiquetas muy ...
  #1 (permalink)  
Antiguo 02/07/2015, 10:58
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Problema con la eliminación de contenidos entre etiquetas

Hola a todos

Hacía mucho tiempo que no iniciaba un post aquí, pero hoy necesito vuestra ayuda.

Resulta que tengo que filtrar unas etiquetas muy concretas de un código html y sus contenidos.
Para ello estoy usando un replaceAll con una expresión regular.

El problema se produce cuando existen varias etiquetas de ese tipo en un texto, ya que se elimina todo el contenido entre la apertura de la primera etiqueta y el cierre de la última, y no quiero que ocurra eso, ya que ese contenido debe permanecer.

Os dejo un ejemplo sencillo:

public class HelloWorld{

public static void main(String []args){
String text = "<blockquote class='derecho'>texto derecha</blockquote><p>Texto intermedio</p><blockquote class='izquierdo'>texto izquierda</blockquote><div>Texto final</div>";
text = text.replaceAll("<blockquote[^>]*>(?s).*(?s)</blockquote>","");
System.out.println(text);
}
}

Podeis ejecutarlo en: http://www.tutorialspoint.com/compile_java_online.php

Un saludo
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #2 (permalink)  
Antiguo 02/07/2015, 13:21
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problema con la eliminación de contenidos entre etiquetas

Yo una vez tuve el mismo problema, y llegué a la conclusión de que debido al funcionamiento de las regex (empiezan el análisis de derecha a izquierda), la pedazo de regex que tendría que hacer sería incomprensible en el improbable caso de que consiguiese hacerla.

Así que te propongo lo que hicimos nosotros, puede ser menos eficiente pero es más entendible y sencilla de debuggear. Hay que usar Matcher (group), recursividad y StringBuilder.

Con el matcher buscas la etiqueta que te interesa (inicio y fin), luego compruebas que dentro de ese trozo no está la etiqueta y puedes sustituir sin peligro. En el caso de que esté la etiqueta, tienes que diferenciar el caso de que estén anidadas o no, para escoger el trozo literal que vas a sustituir. El StringBuilder es para ir sacando una copia modificada del texto, porque buscar y modificar al mismo tiempo no es recomendable.

No quiero entrar más en detalle porque igual me lío o te lío a ti, pero buscaré el código por si acaso lo necesitas.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 02/07/2015, 14:18
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema con la eliminación de contenidos entre etiquetas

Buenas,

Te recomiendo que para ello utilices jSoup: http://jsoup.org/

La curva de aprendizaje es mínima y te permite hacer eso fácilmente sin tener que liarte con expresiones regulares.

Tu ejemplo se puede hacer facilmente:

Código Java:
Ver original
  1. Document doc = Jsoup.parse(text);
  2. //Eliminar todos los blockquote del documento
  3. for(Element element : doc.select("blockquote") )
  4. {
  5.     element.remove();
  6. }

O bien:

Código Java:
Ver original
  1. Document doc = Jsoup.parse(text);
  2. //Eliminar solo el primero
  3. doc.select("blockquote").first().remove();


NOTA: si te interesa más seguir con expresiones regulares, aquí discutimos bastante ya de un tema similar: http://www.forosdelweb.com/f45/conse...s-web-1122898/

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #4 (permalink)  
Antiguo 03/07/2015, 00:34
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: Problema con la eliminación de contenidos entre etiquetas

¿Con jsoup es posible eliminar un tag y su contenido para algún tag concreto? es decir en el caso de los blockquote imagínate que quiero eliminar sólo el class="derecho".
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 03/07/2015, 00:38
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema con la eliminación de contenidos entre etiquetas

Código Java:
Ver original
  1. doc.select("blockquote.derecho").first().remove();

http://jsoup.org/cookbook/extracting...elector-syntax


Un saludo
__________________
If to err is human, then programmers are the most human of us

Última edición por Profesor_Falken; 03/07/2015 a las 00:56
  #6 (permalink)  
Antiguo 03/07/2015, 01:29
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: Problema con la eliminación de contenidos entre etiquetas

Es que puedo tener varios <span></span> con ids diferentes y sólo es común la primera parte del id, y ahí ando un poco perdido. No hay posibilidad de añadirles un class, los genera una aplicación externa.

¿Igual debería usar ahí una regexp dentro de JSOUP con un pseudo selector?
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}

Última edición por Fuzzylog; 03/07/2015 a las 01:42
  #7 (permalink)  
Antiguo 03/07/2015, 02:05
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema con la eliminación de contenidos entre etiquetas

Buenas,

Da la sensacion de que tus requerimientos se amplian en cada post que escribes.

Si hubieses leido el link sobre los selectores que te he puesto, habrias visto esto casi al principio:
Cita:
[attr~=regex]: elements with attribute values that match the regular expression; e.g. img[src~=(?i)\.(png|jpe?g)]
Código Java:
Ver original
  1. doc.select("span[id~=TUREGEX])

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #8 (permalink)  
Antiguo 03/07/2015, 02:46
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: Problema con la eliminación de contenidos entre etiquetas

Muchas gracias, a decir verdad estuve a punto de usar otro selector

Lo que me estaba fastidiando ahora es que al hacer el parse a un fragmento de html se le añaden los tags del html completo, pero ya lo he solucionado llamando al body().html() antes de hacer el toString().

Un saludo.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #9 (permalink)  
Antiguo 03/07/2015, 03:05
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: Problema con la eliminación de contenidos entre etiquetas

Er, ¿jugamos una partidita?
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #10 (permalink)  
Antiguo 03/07/2015, 09:43
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema con la eliminación de contenidos entre etiquetas

¿Qué tal una agradable partida de ajedrez?
__________________
If to err is human, then programmers are the most human of us

Etiquetas: contenidos, etiquetas, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:58.