Retroceder   Foros del Web > Programación para sitios web > PHP

Tema Cerrado
 
Herramientas Desplegado
Antiguo 05-dic-2005, 13:19   #1 (permalink)
dzapata ha deshabilitado el karma
 
Fecha de Ingreso: julio-2005
Mensajes: 24
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.

Última edición por dzapata; 05-dic-2005 a las 13:26.
dzapata está desconectado  
Antiguo 05-dic-2005, 14:14   #2 (permalink)
dreglad ha deshabilitado el karma
 
Fecha de Ingreso: noviembre-2002
Ubicación: México, DF
Mensajes: 83
Enviar un mensaje por ICQ a dreglad Enviar un mensaje por MSN a dreglad Enviar un mensaje por Yahoo  a dreglad
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]) . "...";

dreglad está desconectado  
Antiguo 06-dic-2005, 06:49   #3 (permalink)
dzapata ha deshabilitado el karma
 
Fecha de Ingreso: julio-2005
Mensajes: 24
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 está desconectado  
Antiguo 06-dic-2005, 07:23   #4 (permalink)
dzapata ha deshabilitado el karma
 
Fecha de Ingreso: julio-2005
Mensajes: 24
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
dzapata está desconectado  
Antiguo 06-dic-2005, 07:38   #5 (permalink)
sergiold ha deshabilitado el karma
 
Fecha de Ingreso: octubre-2004
Ubicación: Barcelona
Mensajes: 751
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,
sergiold está desconectado  
Antiguo 09-feb-2006, 18:22   #6 (permalink)
macbomb está en el buen camino
 
Fecha de Ingreso: enero-2003
Mensajes: 56
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
__________________
MACBOMB
webmast....... :adios:
macbomb está desconectado  
Antiguo 01-oct-2008, 05:47   #7 (permalink)
gelg ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2006
Mensajes: 1
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...
gelg está desconectado  
Antiguo 01-oct-2008, 10:03   #8 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 16.009
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.
__________________
Blog Web
GatorV está desconectado  
Tema Cerrado

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 10:27.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96