![]() |
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. |
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: |
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. |
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 |
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, |
Por si te sirve, yo lo solucione asi: Código PHP: |
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: |
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.