PHP: Cortar texto

18 de Mayo 2008 – 9:10 pm

Una manera rápida para recortar un texto en PHP es usando la función substr.

Un primer problema que nos puede surgir es de apariencia, porque al especificar una longitud hasta la que cortar el texto, 3er parámetro, puede pasar que se corte una palabra. Por ejemplo:

  1. <?php
  2. $cadena=‘Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nulla quis risus. Curabitur in felis ut nibh convallis dapibus. Praesent pulvinar ornare nisl.’;
  3. // Nota: concatenamos unos puntos suspensivos (…) para dar a entender que el texto continua.
  4. echo substr($cadena,0,30).‘…’;
  5. ?>

La cadena resultante sería “Lorem ipsum dolor sit amet, co…”.

Lo ideal sería que la última palabra no quedara cortada. Para ello podemos recuperar la posición que ocupa en la cadena de texto, el siguiente espacio en blanco apartir del carácter del que queremos cortar la cadena. Para ello podemos usar la función strpos.

  1. <?php
  2. $cadena=‘Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nulla quis risus. Curabitur in felis ut nibh convallis dapibus. Praesent pulvinar ornare nisl.’;
  3. // Nota: concatenamos unos puntos suspensivos (…) para dar a entender que el texto continua.
  4. echo substr($cadena,0,strpos($cadena,‘ ‘,30)).‘…’;
  5. ?>

La cadena resultante sería “Lorem ipsum dolor sit amet, consectetuer…”.

Estos ejemplos son válidos si el texto a cortar es texto que no tiene código HTML. Si el texto contiene etiquetas HTML, aparece un segundo problema más grave, que es dejar etiquetas sin cerrar, pudiendo llegar a provocar un desbarajuste en tu página. Lo más sencillo para evitar este desbarajuste es usar la función strip_tags y limpiar el texto de estas etiquetas. Lo malo es que quedará sin el formato que le darían las etiquetas.

Si lo que se desea es conservar ese formato, hay que implementar una función que testee que todas las etiquetas están cerradas. Además puede surgir un tercer problema: al cortar el texto puede ocurrir que justo en el cáracter en el que se desea cortar el texto, se esté definiendo una etiqueta y ésta quede a medias. Por ejemplo: “…<a hre”. Por lo que la función también debería controlar eso.

Una posible solución sería:

  1. <?php
  2. function cerrar_tags($html)
  3. {
  4. // 1° Comprobamos que no se ha quedado ninguna “etiqueta a medias”. Ejemplo: “…<a hre”
  5. $ultimaAparicion=strrpos($html,‘<’);
  6. // si desde la última aparición de < no hay un >, implica “etiqueta a medias”
  7. if(strpos(substr($html,$ultimaAparicion),‘>’)===false)
  8. // Eliminamos ese último trozo
  9. $html=substr($html,0,$ultimaAparicion);
  10. // Almacenamos todas las etiquetas por orden, las de apertura y de cierre
  11. preg_match_all(“#<(/{0,1}[a-z]+)( .*)?(?!/)>#iU”,$html,$resultado);
  12. $etiquetas=$resultado[1];
  13. // Pila donde almacenaremos las etiquetas que se han quedado abiertas
  14. $pila=array();
  15. // Etiquetas que no deben ser cerradas
  16. $noCerrar=array(‘br’, ‘hr’, ‘img’, ‘base’, ‘meta’, ‘input’, ‘area’, ‘link’, ‘basefont’, ‘col’, ‘param’, ’sound’, ‘area’);
  17. foreach($etiquetas as $unaEtiqueta)
  18. {
  19. // Si la etiqueta no es de cierre…
  20. if($unaEtiqueta[0]!=‘/’)
  21. {
  22. // y no está en el array de etiquetas a no cerrar…
  23. if(!in_array($unaEtiqueta,$noCerrar))
  24. // metemos la etiqueta en la pila
  25. array_push($pila,$unaEtiqueta);
  26. }
  27. // Si es de cierre, comprobamos que las etiquetas estan cerradas por orden
  28. elseif(substr($unaEtiqueta,1)==$pila[count($pila)-1])
  29. // Sacamos la etiqueta ya cerrada
  30. array_pop($pila);
  31. else // Informamos del error
  32. return ‘Código mal formado/anidado’;
  33. }
  34. // Si quedan etiquetas en la pila se usan para cerrar las etiquetas que se han quedado abiertas
  35. while($etiqueta=array_pop($pila))
  36. $html.=‘</’.$etiqueta.‘>’;
  37. return$html;
  38. }
  39. $cadena=‘<div>Ejemplo: <a href=”#”>Enlace1</a><p>Texto entre dos enlaces</p><a href=”#”>Enlace2</a><br /><span>Texto</span> <a href=”#”>Enlace <span>número</span> 3</a></div>’;
  40. // Nota: concatenamos unos puntos suspensivos (…) para dar a entender que el texto continua.
  41. echo cerrar_tags(substr($cadena,0,strpos($cadena,‘ ‘,30))).‘&hellip;’;
  42. ?>

Esta función funciona si las etiquetas están bien anidadas: se cierran en el orden inverso del que se abren.

  1. 4 Comentarios en “PHP: Cortar texto”

  2. Excelente funcion, me vendrá muy bien dado que uso mucho substr

    Por raul el Sep 6, 2008

  3. Gracias, justo lo que buscaba, y funciona perfectamente.

    Por david el Abr 28, 2009

  4. Uh que simple pero, muy util gracias =D

    Por lola el Ene 14, 2010

  1. 1 Trackback(s)

  2. Nov 23, 2008: xanfran » Descargar los ejemplos

Deja un Comentario