Foros del Web » Programando para Internet » PHP »

Cómo fraccionar una cadena en subcadenas sin que queda una palabra cortada

Estas en el tema de Cómo fraccionar una cadena en subcadenas sin que queda una palabra cortada en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 05/12/2005, 13:19
 
Fecha de Ingreso: julio-2005
Mensajes: 24
Antigüedad: 18 años, 9 meses
Puntos: 0
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/12/2005 a las 13:26
  #2 (permalink)  
Antiguo 05/12/2005, 14:14
dreglad
Invitado
 
Mensajes: n/a
Puntos:
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]) . "...";

  #3 (permalink)  
Antiguo 06/12/2005, 06:49
 
Fecha de Ingreso: julio-2005
Mensajes: 24
Antigüedad: 18 años, 9 meses
Puntos: 0
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.
  #4 (permalink)  
Antiguo 06/12/2005, 07:23
 
Fecha de Ingreso: julio-2005
Mensajes: 24
Antigüedad: 18 años, 9 meses
Puntos: 0
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
  #5 (permalink)  
Antiguo 06/12/2005, 07:38
 
Fecha de Ingreso: octubre-2004
Mensajes: 751
Antigüedad: 19 años, 6 meses
Puntos: 4
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
  #6 (permalink)  
Antiguo 09/02/2006, 18:22
 
Fecha de Ingreso: enero-2003
Mensajes: 55
Antigüedad: 21 años, 3 meses
Puntos: 0
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:
  #7 (permalink)  
Antiguo 01/10/2008, 04:47
 
Fecha de Ingreso: febrero-2006
Mensajes: 1
Antigüedad: 18 años, 2 meses
Puntos: 0
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...
  #8 (permalink)  
Antiguo 01/10/2008, 09:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
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.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 08:33.