Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   PHP (http://www.forosdelweb.com/f18/)
-   -   Cómo fraccionar una cadena en subcadenas sin que queda una palabra cortada (http://www.forosdelweb.com/f18/como-fraccionar-cadena-subcadenas-sin-que-queda-palabra-cortada-355246/)

dzapata 05/12/2005 13:19

Cómo fraccionar una cadena en subcadenas sin que queda una palabra cortada
 
hola a todos, les escribo a ver si alguno de ustedes conoce de alguna función o si han desarrollado alguna función que me permita trocear una cadena en longitudes de tamaño xx, sin correr el riesgo de que quede una palabra cortada.

Lo que pretendo hacer es un reporte, pero necesito controlar la cántidad de caracteres que se mostrarán por línea.

Ejemplo :
Si tengo la cadena: prueba de longitud del campo xxx
y quisiera que esa cadena la fraccionara para mostrar en cada linea 10 caracteres, tendría que hacer algo como:
prueba de
longitud del
campo ...

Gracias de verdad en lo que me puedan ayudar.

He tratado de desarrollar un código para está función, pero no he logrado que trabaje del todo bien. Aquí la coloco para ver que es lo que falla.

<?
function Ajusta_Texto($cadena,$longitud){
//1º Paso: conocer lo saltos de línea que posee el texto, con el fin de crear un explode a partir de dichos saltos
$cadena = nl2br($cadena);
$arreglo = explode("<br />",$cadena);
//2º Paso se recorre el vector obtenido y en cada posición del vector se comienza a insertar los saltos de linea coorespondiente,
// para que cumpla con la longitud especificada

$cadena_a_retornar="";
for($indice=0;$indice<= count($arreglo)-1;$indice++){
/* for($aux=$longitud+1;$aux >=0; $aux--){
echo "Posicion Nº" . $aux . " = " . substr($cadena,$aux,1) . "<br>";
if(substr($cadena,$aux-1,1) == " ")
break;
}//cierre del for
echo "sale aux en: " , $aux;*/
if($indice>0)
$cadena= substr($arreglo[$indice],2,strlen($arreglo[$indice]));
else
$cadena = $arreglo[$indice];
$fin_de_cadena = false; //booleano para indicar si ya se ha recorrido en sutotalidad la subcadena contenida en la posición del vector
while($fin_de_cadena == false){
if(strlen($cadena)<= $longitud){
$cadena_a_retornar.= substr($cadena,0);
$fin_de_cadena = true;
}
else{
if(substr($cadena,$longitud,1) != " "){ //no se puede fraccionar la subcadena de forma directa, de modo que se busca la palabre anterior
//1º Caso: Si el punto limite coincide con el fin de la palabra o del texto ---> se puede fraccionar sin problema
if(substr($cadena,$longitud + 1, 1) == " "){
$cadena_a_retornar.= substr($cadena,0,$longitud); //. "<br>";
$cadena = substr($cadena,$longitud); //elimina de la cadena la subcadena procesada
}
else{ //el punto limite no coincide con el fin de la palabra ---> se busca la palabra anterior a ella para fraccionar

for($ddd=$longitud+1;$ddd >=0; $ddd--){
if(substr($cadena,$ddd-1,1) == " ")
break;
}//cierre del for

$cadena_a_retornar.= substr($cadena,0,$longitud-$ddd+2) . "<br>";
$cadena = substr($cadena,$longitud-$ddd-2); //elimina de la cadena la subcadena procesada
}
//2º Caso: Sea un palabra ---> Se buscar la palabra inmediata a ella para poder fragmentar la cadena
}//cierre del if
else{
$cadena_a_retornar.= substr($cadena,0,$longitud). "<br>"; //toma la subcadena procesada
$cadena = substr($cadena,$longitud); //elimina de la cadena la subcadena procesada
}//cierre del else
}
}//cierre del while
$cadena_a_retornar.= "<br>"; //se agrega el salto de línea que tenía originalmente
}//cierre del for
return($cadena_a_retornar);
}//cierre de la función

El problema que estoy obteniendo con mi función es cuando hay una palabra que va a quedar cortada con la fragmentación ... y se me está presentando con el for que hago para buscar la palabra que está inmediatamente anterior a ella ... el for debería salirse cuando encuentre en espacio en blanco ... pero por alguna razón ejecuta el ciclo varias veces.

dreglad 05/12/2005 14:14

Hace tiempo escribí esta función que me resultó útil.. es un algoritmo bastante burdo, lógicamente hay más eficientes, pero sirve muy bien..

Código PHP:

function texto_muestra($txt$limite 30) {
    
$txt preg_replace("/\s{2,}/"" "trim(strip_tags($txt)));
    
$txt str_replace("&nbsp;"" "$txt);
    
preg_match("/(.+)\s(.+)$/"substr($txt0$limite), $matches);
    return 
trim($matches[1]) . "...";



dzapata 06/12/2005 06:49

Probé tu función, pero lo que veo que hace es colocarle punto suspensivos al párrafo. ejemplo: si colocas un parrafo ---> te retorna como los primeros 10 caracteres del párrafo con puntos suspensivos, y lo que deseo hacer es que el párrafo lo fragmente pedazos de xx longitud c/u, pero asegunrámdose que en esa fragmentación no quede entrecortada una palabra.

dzapata 06/12/2005 07:23

Ya lo logré ... la función a mi parecer no es muy eficiente, pero por lo menos hace lo que quiero.

Aqui les envío la función para que la utilicen y si le encuentran la forma de mejorala.

function Ajusta_Texto($cadena,$longitud){
//1º Paso: conocer lo saltos de línea que posee el texto, con el fin de crear un explode a partir de dichos saltos
$cadena = nl2br($cadena);
$arreglo_salto_linea = explode("<br />",$cadena); //divide la cadena en vectores tomando como base los saltos de linea
$cadena_a_retornar=""; //almacenará la nueva cadena formateada
$numero_caracteres = 0; //servirá para controlar la cantidad de caracteres que se agregarán por línea
for($indice_salto = 0; $indice_salto <= count($arreglo_salto_linea)-1; $indice_salto++){
//2º Paso: conocer los espacios en blanco que conforman a la subcadena por cada posición del vector, con el fin de crear un explode a partir de dichos espacios
$arreglo_espacio = explode(" ",$arreglo_salto_linea[$indice_salto]);
for($indice_espacio = 0; $indice_espacio <= count($arreglo_espacio)-1; $indice_espacio++){
if ($indice_espacio == 0 && $indice_salto>0)
$arreglo_espacio[$indice_espacio] = substr($arreglo_espacio[$indice_espacio],2);
if($numero_caracteres + strlen($arreglo_espacio[$indice_espacio]) +1 > $longitud){
$cadena_a_retornar.= "<br>";
$numero_caracteres = strlen($arreglo_espacio[$indice_espacio]) + 1;
}
else
$numero_caracteres = $numero_caracteres + strlen($arreglo_espacio[$indice_espacio]) + 1;
$cadena_a_retornar.= " " . $arreglo_espacio[$indice_espacio];
}
$arreglo_espacio = NULL;
$cadena_a_retornar.= "<br>"; //se agrega el salto de línea que tenía originalmente
}//cierre del for
return($cadena_a_retornar);
}//cierre de la función

sergiold 06/12/2005 07:38

Quizás te sirva esta función: wordwrap()

Corta cadenas de a un alongitud determinada pero sin cortar palabras...

Bueno mejor leete esto:

www.php.net/wordwrap

Saludos,

macbomb 09/02/2006 18:22

Por si te sirve, yo lo solucione asi:

Código PHP:

<?
function corta($texto,$largo){
$nuevo_texto wordwrap($texto,$largo"<");
$pos strpos($nuevo_texto,"<");
return  = 
substr($nuevo_texto,0,$pos);
}
?>

S2

gelg 01/10/2008 04:47

Respuesta: Cómo fraccionar una cadena en subcadenas sin que queda una palabra cortada
 
Muchas gracias macbomb, me resultó muy útil esta solucion, bueno había un pequeño error de sintaxis, y yo añadí la comprobación de que sólo hiciera el corte en caso de que fuese necesario:
Código PHP:

function cortarTexto($cadena$num$delim='...'){        
    
$len strlen($cadena);        
    if (
$len $num) {    
        
$cadAux wordwrap($cadena$num"<"); 
        
$pos strpos($cadAux"<"); 
        return 
substr($cadAux0$pos) . $delim
    }else{
        return 
$cadena;
    }


P.D: Un poco tarde esta respuesta, perdón por reabrir el post...

GatorV 01/10/2008 09:03

Respuesta: Cómo fraccionar una cadena en subcadenas sin que queda una palabra cortada
 
Gracias por tu aporte,

En efecto el tema es muy viejo por lo que mejor si alguien tiene alguna duda cree un tema nuevo.

Saludos.

Tema cerrado.


La zona horaria es GMT -6. Ahora son las 10:55.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.