PHP – Como Cortar un Texto a un largo determinado

Muchas veces cuando estamos realizando nuestras páginas y aplicaciones necesitamos presentar solo una porción del texto ( de un String ), como por ejemplo cuando tenemos un artículo y sólo queremos mostrar un pequeño extracto en alguna parte.

/**
* Return sub string sin etiquetas HTML y puntos suspensivos al final
* @param $string String 
* @param $length Largo que queremos el substring
* @return String con ...
*/

public function getSubString($string, $length=NULL)
{
    //Si no se especifica la longitud por defecto es 50
    if ($length == NULL)
        $length = 50;
    //Primero eliminamos las etiquetas html y luego cortamos el string
    $stringDisplay = substr(strip_tags($string), 0, $length);
    //Si el texto es mayor que la longitud se agrega puntos suspensivos
    if (strlen(strip_tags($string)) > $length)
        $stringDisplay .= ' ...';
    return $stringDisplay;
}

Yo suelo colocar el nombre de las variables en mis funciones en inglés, por costumbre y por estandar. Veamos como está compuesta la función:

La función acepta dos parámetors $string que es el texto que queremos acortar y length que es el largo que queremos que nos devuelva el nuevo texto.

Utilizamos  la función substr de PHP, esta función acepta los siguientes parámetros:

string substr ( string $string , int $start [, int $length ] )

Un $string que es el texto que queremos acortar y los otros dos parámetros es donde queremos comenzar y donde queremos que finalice. Adicionalmente utilizamos la función strip_tags que elimina las etiquetas HTML del texto, esto nos sirve para dos cosas la primera es para quitar cualquier formato del texto y segundo nos sirve para eliminar cualquier etiqueta que nos pueda ocasionar problemas ya sea al guardar el texto en una base de datos o al utilizarlo como una variable en nuestro código. Si quieres conservar las etiquetas simplemente quita strip_tags y deja solo la variable $string.

Tambien damos un valor por defecto a la longitud (length) en caso de que no se le pase este valor a la función.

Por último simplemente verificamos que si el largo del texto es mayor que el largo al que lo queremos cortar le agregue puntos suspensivos al final.

Forma de uso:

//El string que queremos recortar con etiquetas HTML
$texto = "<p>Hay dos cosas infinitas: el Universo y la <strong>estupidez humana</strong>. Y del Universo no estoy seguro.</p>"
//La función colocando un largo de 42 caracteres contando los espacios.
getSubString($texto, 42)

Obtendremos:

Hay dos cosas infinitas: el Universo y la ...

Es una función bastante sencilla y útil en muchos casos.

Si tienes cualquier duda, sugerencia o quieres simplemente saludar, por favor deja un comentario.

4 comments

  1. Hola, gracias por el aporte, tengo un problema un poco mas complejo. Tengo un div de 170px de ancho donde pinto una cadena y necesito que se muestre en una sola linea. la solución inicial fue recortar la cadena hasta 27 caracteres, esto funciona bien siempre q la cadena venga en minúscula, pero cuando la cadena es mayúscula entonces se pasa a una segunda linea. (pues es diferente el numero de pixeles al pintar ‘aaggrrwwll’ y ‘AAGGRRWWLL’) y no puedo cambiar todo a minúscula por q debo pintarla como el usuario la registró.

    Se me ocurre no recortar la cadena por numero de caracteres sino por pixeles, es decir cortar hasta los 150px y adicionar los ‘…’, pero no se como hacerlo.

    si se les ocurre una idea, bienvenida es!!!
    Saludos,

    1. Hola compagm, una solución que puedes hacer es probar si los caracteres están todos en mayúsculas con:

      ctype_upper($string)

      Y dependiendo de eso cambiar el largo del texto. También si quieres probar que una sola letra esté en mayúscula puedes utilizar:

      preg_match(‘/[A-Z]/’, $string)

      Puedes hacer pruebas con varias frases y ver que largo te resulta mejor en cada caso.

      La solución que planteas de cortar por pixeles no es muy práctica ya que recuerda que va a depender del navegador, resolución, etc y no va a ser consistente en todos.