Recortar un texto con PHP.

Resumen.

Una tarea bastante frecuente, por ejemplo al presentar la relación de artículos publicados, es presentarlos con las primeras líneas del artículo en cuestión. La cuestión es como hacer esto de la manera más eficiente posible, en este artículo vamos a ver como hacemos esto, la forma fácil, y la forma menos fácil, pero mas elegante, por decirlo de alguna manera.

Artículo.

Recortar las primeras líneas de un artículo es muy frecuente para presentar ya sea un artículo o un producto de una tienda online, algo así como esto (tomando como referencia el resumen de este mismo artículo):

Una tarea bastante frecuente, por ejemplo al presentar la relación de artículos publicados, es...

Donde hemos recortado los primeros 100 caracteres, pero si los contamos, vemos que no son 100, son 94, incluyendo los espacios en blanco. ¿Cómo lo hemos hecho?

Si cortamos los primeros 100 caracteres de modo estricto tendríamos el siguiente resultado:

Una tarea bastante frecuente, por ejemplo al presentar la relación de artículos publicados, es pre…

Lo cual queda un poco “feo”, se ha quedado una palabra cortada sin terminar, pero ¿cómo podemos evitar esto? Vamos a ver la forma que primero se nos ocurriría para hacer esto, y seguidamente vamos a ver la forma de evitar que las palabras se corten antes de terminar.

Para recortar un texto podemos usar la función substr(cadena, par1,par2). Que podría quedar de la siguiente forma:

$recorta = substr($texto, 0,100);


La función substr() puede recibir dos o tres parámetros, el primero seria la cadena de caracteres (un texto en nuestro caso) que vamos a recortar. Los otros, que pueden ser uno o dos, pueden tomar las siguientes formas:

substr($cadena, 2); // Eliminamos 2 caracteres de la izquierda
substr($cadena, 0,-4); // Eliminamos 4 caracteres por la derecha
substr($cadena, 2,-3); // Eliminamos dos caracteres por la izquierda y tres por la derecha
substr($cadena, -3); // Imprimimos los tres caracteres de la derecha
substr($cadena, 0,10); // Imprimimos los 10 primeros caracteres de la izquierda


Pero como hemos visto, aplicar esta función nativa, no nos da el resultado deseado. ¿Qué podemos hacer para no cortar palabras antes de su terminación? Vamos a ello.

Lo primero que tenemos que tener en cuenta es que el texto que queremos recortar puede contener etiquetas html como marcas de párrafo, saltos de línea o estilos CSS, y debemos tener en cuenta no contar estos caracteres como caracteres de texto, ya que esto podría hacer que tuviéramos un resultado considerablemente lejano al deseado. Para conseguir esto, usaremos la función strip_tags() que elimina todo el etiquetado de una cadena de texto y quedarnos así estrictamente con lo que es texto.

Seguidamente contaremos el número de caracteres, si es menor o igual que los caracteres que vamos a recortar, solo quitamos las posibles etiquetas existentes.

Si hay mas caracteres de los que deseamos recortar y la hacemos mediante la función substr(), entonces mediante la función explode() creamos un array con la cadena, tomando como separador los espacios en blanco. Una vez creado este array, eliminamos el ultimo elemento mediante la función array_pop(), ya que es este ultimo elemento el que puede contener una palabra incompleta. Seguidamente, mediante la función implode(), volvemos a crear una cadena con el array, y listo, ya tenemos nuestro texto recortado sin cortar la ultima palabra. La función seria esta:

<?php
// Recorta un texto a un determinado numero de caracteres
// El resultado casi nunca es exacto, y siempre algo menor al indicado.
// Esto ocurre por que se elimina la ultima palabra completa
// Tambien elimina etiquetas
// Funcion desarrollada por ArtesaniaWeb.ES

function RecortTexto($texto, $max_caract){
$ntexto = strlen(strip_tags($texto));
$res_texto = substr(strip_tags($texto), 0, $max_caract);
if($ntexto <= $max_caract){
$dev_texto = $res_texto;
}else{
// Asi eliminamos las palabras incompletas y el fastidioso simbolo �
$array_texto = explode(' ', $res_texto);
array_pop($array_texto); // Elimina el ultimo elemento del array
$recor_texto = implode(' ', $array_texto);
$pu_susp = '...';
$dev_texto = "$recor_texto$pu_susp";
}
return $dev_texto;
}
// =============== Ejecutamos la funcion
$eltexto = 'Una tarea bastante frecuente, por ejemplo al presentar la relación de artículos publicados, es presentarlos con
las primeras líneas del artículo en cuestión. La cuestión es como hacer esto de la manera más eficiente posible, en este
artículo vamos a ver como hacemos esto, la forma fácil, y la forma menos fácil, pero mas elegante, por decirlo de alguna
manera.';

$max_car = 100; // Numero maximo de caracteres del texto recortado

$new_texto = RecortTexto($eltexto, $max_car);

$n_orig = strlen($eltexto);
$n_new = strlen($new_texto);

echo "<b>Original</b><br />
$eltexto<br />
--- <br />
$n_orig caracteres
<hr>
<b>Recortado SIN cortar palabras</b><br />
$new_texto<br />
--- <br />
$max_car caracteres indicados en la funcion<br />
$n_new caracteres del texto <br />
";

$recorta = substr($eltexto, 0,100);

echo "<hr><b>Recortado cortando palabras</b><br />
$recorta... <br />
".strlen($recorta)." caracteres, como se indica en la funcion";
?>


Como vemos, la lógica de su funcionamiento es muy simple, solo es cuestión de pensar que queremos conseguir y que pasos tenemos que dar para ello.

Por ultimo, agregar que esta función no nos va a dar siempre el número de caracteres exactos indicados en la función, el motivo, obvio, si el ultimo carácter coincide con un espacio en blanco, el resultado será exacto al indicado, si por el contrario, cae en medio de una palabra corta, como un artículo o preposición, poco se alterará su valor, pero si la ultima palabra es larga, como “programación” se podría perder todo ese número de caracteres, tanto mas, como cuanto mas al final de la palabra fuera el corte.
Tags: Recortar || resumen || substr || array_pop || RecortTexto

Comentarios.

Sin comentarios, publica el tuyo.