Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Al crear un leer mas, se descuadra HTML

Estas en el tema de Al crear un leer mas, se descuadra HTML en el foro de PHP en Foros del Web. Buenas Estoy realizando una web con noticias en las que para que en el indice no aparezca la noticia entera, hago un famoso leer más. ...
  #1 (permalink)  
Antiguo 22/01/2013, 05:42
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 15 años, 11 meses
Puntos: 0
Al crear un leer mas, se descuadra HTML

Buenas

Estoy realizando una web con noticias en las que para que en el indice no aparezca la noticia entera, hago un famoso leer más.

Lo que ocurre es que como la noticia guardada tiene código HTML, pues al cortarla con substr a menos caracteres, si deja etiquetas como por ejemplo <p> o <div> sin su correspondiente cierre, descuadra desde ahi el resto de código html.

He intentado recorrer el texto reducido buscando como poder de alguna forma saber el total de etiquetas que hay sin cierre, pero no se me ocurre exactamente como hacerlo y si es la manera mas apropiada. Es decir, mi idea es recorrer con un bucle o una función el texto de caracteres, sabiendo en todo momento cuantos <p>, <div>, <b>, <strong>, <em>, etc pueda haber y saber si se cierran o no. Lo que no se me ocurre es como cumplimentarlo y si hay alguna función que ya de por si lo haga, dado que he estado buscando pero sin demasiado éxito.

Otra cosa que he intentado es strip_tags, pero claro, si lo hago tal cual:
Código PHP:
Ver original
  1. $texto = strip_tags($texto);
Deja como resultado un texto plano feísimo visualmente y si lo hago indicando que etiquetas si se pueden omitir:
Código PHP:
Ver original
  1. $texto = strip_tags($texto,'<br><br /><p>');
El resultado es el del principio, es decir, descuadra el html en caso de que no se cierre alguna etiqueta importante o incluso menos importante en tema de cierre como <strong> por ejemplo.

No se que sugerís. Un saludo gracias de antemano como siempre

PD: he marcado sin querer que el tema está solucionado, pero como veis no hay respuesta alguna. Lo siento :(

Última edición por yosoloyo; 22/01/2013 a las 05:46 Razón: Marcar sin querer que estaba solucionado
  #2 (permalink)  
Antiguo 23/01/2013, 05:05
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Al crear un leer mas, se descuadra HTML

Hola!!

A nadie se le ocurre alguna idea?? no digo un código, al menos una idea de por donde podría tirar. No creo que sea al primero que le ocurre
  #3 (permalink)  
Antiguo 23/01/2013, 07:02
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 10 meses
Puntos: 181
Respuesta: Al crear un leer mas, se descuadra HTML

Bueno, aunque no tengo a la mano como lo hice yo yo no me preocuparia mucho en ese sentido. En mi caso en concreto le coloco muy poco texto por lo cual las posibilidades de que el texto cortado sea parte de un nuevo parrafo son bastante reducidas.

Lo que podrias hacer es eliminarle las etiquetas, con el substr buscas por decir algo los primeros 400 caracteres, de ese texto que tienes buscas donde se encuentra el ultimo espacio en blanco y vuelves a realizar el substr desde 0 hasta donde fue encontrado el ultimo espacio en blanco de esta forma nunca se quedara cortado en la mitad de una palabra.

En caso de que necesites colocar por ejemplo al menos dos parrafos se complicaria un poco mas y te tocaria quitar las etiquetas, buscar los puntos aparte y añadirle un <br /> para separar los parrafos pero me parece que ya es mas complicado.
__________________
Blog de humor http://elcuasatar.net63.net/
  #4 (permalink)  
Antiguo 23/01/2013, 08:15
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Al crear un leer mas, se descuadra HTML

Cita:
Iniciado por cuasatar Ver Mensaje
Bueno, aunque no tengo a la mano como lo hice yo yo no me preocuparia mucho en ese sentido. En mi caso en concreto le coloco muy poco texto por lo cual las posibilidades de que el texto cortado sea parte de un nuevo parrafo son bastante reducidas.

Lo que podrias hacer es eliminarle las etiquetas, con el substr buscas por decir algo los primeros 400 caracteres, de ese texto que tienes buscas donde se encuentra el ultimo espacio en blanco y vuelves a realizar el substr desde 0 hasta donde fue encontrado el ultimo espacio en blanco de esta forma nunca se quedara cortado en la mitad de una palabra.

En caso de que necesites colocar por ejemplo al menos dos parrafos se complicaria un poco mas y te tocaria quitar las etiquetas, buscar los puntos aparte y añadirle un <br /> para separar los parrafos pero me parece que ya es mas complicado.
Gracias por la respuesta. Lo de cortar el texto en medio de una palabra no es mi caso, es decir, lo recorro una segunda vez como bien dices hasta el espacio en blanco para que no se corte en medio de la última palabra recogida por ejemplo.

Lo de quitar las etiquetas, también lo he pensado pero como digo en el mensaje 1, queda un texto plano que se ve muy feo (aunque deje por ejemplo el <br / > entre las etiquetas permitidas, pero aún asi se queda bastante feo.

Pongo un ejemplo mas extenso con lo que ocurre:

Código PHP:
Ver original
  1. $texto="<p> Hola, adios, hasta luego, que tal, uno dos tres 1000 </p>";

Si de aquí extraigo con substr por ejemplo 10 caracteres, recoge la etiqueta <p> inicial, pero no la última, por lo que hay un descuadre a partir de ahi con el resto de html que tiene el resto de la página. Cuando pongo ejemplo de <p>, es como si pusiera <div> <b>, <em>, vamos cualquier etiqueta que por el corte de caracteres al hacer substr se queda como texto final (sin contar el 2º recorrido para evitar el corte de una palabra como bien dijiste también).

He visto como posible alternativa (aunque aún no la he podido probar: count_chars y substr_count que por ejemplo tendría que recorrer la cadena varias veces para que me dijera el número total de etiquetas que hay y a partir de ahi actuar en consecuencia añadiendo sus cierres a la etiqueta que quede de substr.

De ahi el pedir ayuda, dado que no se si es lo más adecuado o si hay algún método preestablecido ya que lo haga por si solo.

Gracias de nuevo por tu aportación
  #5 (permalink)  
Antiguo 23/01/2013, 13:34
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 10 meses
Puntos: 181
Respuesta: Al crear un leer mas, se descuadra HTML

Bueno, poniendo de nuevo tu ejemplo en concreto

Código PHP:
$texto="<p> Hola, adios, hasta luego, que tal, uno dos tres 1000 </p>"
Si le quitas las etiquetas quedaria:

Código PHP:
$no_etiquetas=Holaadioshasta luegoque taluno dos tres 1000 
Lo que podrias hacer por ejemplo seria algo como

Código PHP:
$no_etiquetas_corto=Holaadioshasta luego 
Y al final le podrias añadir las etiquetas de apertura y cierre.

Código PHP:
$texto_abreviado="<p>".$no_etiquetas_corto."</p>" 
En mi caso en concreto para mi blog yo uso 400 caracteres que generalmente es para darle una pequeña idea al elector de que va el articulo. Ya cuando le de en leer mas encontrara información mas detallada incluyendo el formato completo (negrita, subrayados, enlaces, etc)

Si me dices que ya sabes como hacer lo del espacio en blanco pues solamente seria poner eso y aplicarlo. Espero y esto te sirva de idea para desarrollar tu trabajo.

La versión dificil es ponerse a contar etiquetas y seguramente se puede hacer pero para que hacerlo dificil cuando se puede hacer facil?

Igual con estilos css puedes adaptar el espacio donde aparecera ese pequeño texto y darle margen, padding y demas cosas para que se vea bien. Apoyate tambien en las hojas de estilos.
__________________
Blog de humor http://elcuasatar.net63.net/

Última edición por cuasatar; 23/01/2013 a las 13:45
  #6 (permalink)  
Antiguo 23/01/2013, 17:34
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Al crear un leer mas, se descuadra HTML

Gracias de nuevo por la contestación.
Viendo lo complicado que puede llegar a resultar, como bien dices, tendré que tirar por esa vía que es la que tenía actualmente que era quitar las etiquetas del texto con strip_tags, dado que el ejemplo que puse era una frase de ejemplo digamos simple.
Yo en mi caso también tengo una noticia que habitualmente suele tener unos 2000 caracteres y la introducción la hago de 500 caracteres, por lo tanto puede que el corte se quede dentro de algún <div> sin cerrar o algún <p> o alguna otra que se abra pero no se cierre y desde ahi se descuadre.
Sigo pensando que se queda muy feo si quito todas las etiquetas, pero de momento es la única opción.

Aún asi si se le ocurre a alguien algo más o conoce algún método o función....... pues sería de agradecer

PD: gracias nuevamente
  #7 (permalink)  
Antiguo 02/02/2013, 07:31
 
Fecha de Ingreso: mayo-2008
Mensajes: 156
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Al crear un leer mas, se descuadra HTML

Bueno por si alguien en un futuro le hace falta, la solución que he visto mas viable es la siguiente:

Cuento con substr_count el numero de etiquetas <p> que hay y se las resto contando con substr_count al total de etiquetas </p> que hay.
En caso de que el primero sea mayor que el segundo, incluyo al final del string los cierres necesarios.

Código PHP:
Ver original
  1. $texto="<p> Hola</p> <p> Adios"; //hay dos aberturas y un solo cierre por lo que descuadraría el texto
  2.  
  3. $topen = substr_count($texto,'<p');
  4. $tclose = substr_count($texto,'</p>');
  5. if($topen >$tclose )
  6. {
  7.     $resta=$topen -$tclose ;
  8.     $i=0;
  9.     while($i<$resta)
  10.     {
  11.         $texto= $texto. "</p>";
  12.         $i++;
  13.     }//fin while
  14. }

No es muy ortodoxo pero da el apaño. Doy el tema por solucionado
  #8 (permalink)  
Antiguo 03/02/2013, 10:55
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 10 meses
Puntos: 181
Respuesta: Al crear un leer mas, se descuadra HTML

Hola, pues tal y como te lo comente en su momento creo que uno en este tema no debe complicarse tanto pero veo que seguiste la idea de contar etiquetas. En si me parece algo sencillo y práctico. Te recomiendo para que sea algo mas generico la realizaras para que fuera mas abstracta y la pudieras aplicar a otros tipos de etiquetas (strong, a, etc) Y no que el día de mañana tuvieras la fea sorpresa de que algun etiqueta por error llegara a quedar sin cerrar. Creo que con lo que tienes simplemente deberias crearla como función y así luego llamarla con todas las etiquetas que te interesan que no quedaran chuecas.

Como lo puedes ver en algun momento eso se podria complicar (por aquello de no saber si primero se debe cerrar un strong y luego un a por ejemplo) Tiene potencial para seguir creciendo. Si se me ocurre algun método (que de hecho creo que lo puedo hacer) lo colocare para que la solución sea mas genérica.
__________________
Blog de humor http://elcuasatar.net63.net/

Etiquetas: descuadra, html
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 16:03.