Foros del Web » Programando para Internet » PHP »

contar palabras en una cadena

Estas en el tema de contar palabras en una cadena en el foro de PHP en Foros del Web. quiero hacer una especie de lista de noticias donde tengo $mensaje = substr($row["mensaje"], 0, 150); echo $mensaje; pero siempre me corta una palabra al final, ...
  #1 (permalink)  
Antiguo 13/01/2003, 11:02
Avatar de lubetpic  
Fecha de Ingreso: enero-2002
Ubicación: San Jose
Mensajes: 679
Antigüedad: 15 años, 10 meses
Puntos: 0
contar palabras en una cadena

quiero hacer una especie de lista de noticias donde tengo

$mensaje = substr($row["mensaje"], 0, 150);
echo $mensaje;

pero siempre me corta una palabra al final, donde va "... leer mas".

me pregunto como puedo quitar la ultima palabra en $mensaje despues del ultimo espacio, que es la que se corta

si alguien puede ayudarme
gracias
  #2 (permalink)  
Antiguo 13/01/2003, 12:05
 
Fecha de Ingreso: agosto-2002
Ubicación: Barcelona
Mensajes: 29
Antigüedad: 15 años, 3 meses
Puntos: 1
Para hacer eso... yo me crearia una función que hiciera lo mismo que el substr pero teniendo en cuenta que no corte una palabra.

La función seria esta:

function wordsubstr($txt, $NumberChars) {
if (strlen($txt) > $NumberChars) {
// Si la cadena de texto es mayor al número de carácteres
// cortamos la cadena y ponemos "..."
$Array_txt = explode(" ", $txt);
$NChars = 0;
$Result = "";
foreach ($Array_txt as $Word) {
if ( ($NChars + strlen($Word) > $NumberChars) ) {
$Result .= "...";
break;
} else {
$NChars += strlen($Word) + 1; //Se suma uno más por el carácter de espacio
if ($Result != "") { $Result .= " "; }
$Result .= $Word;
}
}
return $Result;
} else {
// Si la cadena de texto es menor al número de carácteres
//devolvemos toda la cadena sin los "..."
return $txt;
}
}


$cadena = "Hola que tal como estás? Yo estoy muy bien y tú?";

echo "La función substr devolvería: ".substr($cadena, 0, 15)."<br>";
echo "La función wordsubstr devuelve: ".wordsubstr($cadena, 15);
__________________
Juanan
  #3 (permalink)  
Antiguo 13/01/2003, 15:39
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Aquí va mi versión .. he intentado usar el maximo numero de funciones nativas de PHP .. pues PHP ofrece una GRAN variedad de funciones (sobre todo para manejo de arrays y strings) ..

Código PHP:
<?
function cortar_frase($frase_entrada,$cortar){

   
$frase_corta=substr($frase_entrada,0,$cortar); // obtener la frase cortada.
   
$palabras=str_word_count($frase_corta,1); // obtener array con las palabras.
   
$total_palabras=count($palabras)-1// contar total array elementos y restar 1 elementos
   
$palabras=array_splice($palabras,0,$total_palabras); // le quitamos la ultima palabra.
   
$frase_salida=implode(' ',$palabras); //  y concatenamos con el espacio hacia una cadena.
   
$frase_salida .= "..."// se añaden los puntos suspensivos a la cadena obtenida..

  
return $frase_salida;
}

$frase="Esto es una prueba de esta funcion.";

echo 
'Frase original: '.$frase.'<br>';
echo 
'Frase cortada: '.cortar_frase($frase,10);

?>
El código es muy básico .. pero hace su función. El numero de caracteres a cortar no se tiene en cuenta los caracteres añadidos ... Tampoco se evalua si la ultima palabra es cortada o no .. simplemente se elimina la ultima palabra q resulte de "cortar" la frase origen.


Un saludo,
  #4 (permalink)  
Antiguo 13/01/2003, 15:51
Avatar de lubetpic  
Fecha de Ingreso: enero-2002
Ubicación: San Jose
Mensajes: 679
Antigüedad: 15 años, 10 meses
Puntos: 0
excelente

gracias
  #5 (permalink)  
Antiguo 30/08/2004, 14:00
 
Fecha de Ingreso: agosto-2004
Ubicación: Valencia
Mensajes: 149
Antigüedad: 13 años, 4 meses
Puntos: 0
problemas con el formato

Hola tengo el siguiente problema. Hemos puesto la funcion de cluster y funciona perfectamente, pero en nuestro caso, el texto a mostrar no esta en txt, esta en html, por lo que los tags de parrafo (<p></p>), los muestra aunque no asi, solo muestra un p.
Hemos intentado reemplazar con un espacio en blanco, pero no hay forma, no lo detecta.
Gracias, espero vuestra respuesta.
  #6 (permalink)  
Antiguo 30/08/2004, 22:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si vas a usar la función que en su época propuse (que tiempos xD casi dos años xD) .. como está preparada para funcionar con sólo texto plano .. antes tendrás que quedarte con tu cadena origen SIN html (pero, .. así perderás el formato que le distes en HTML). (para esto podrías usar la función strip_tags() )

Lo ideal es que en tus BD o lo que corresponda guardes sólo texto plano y con PHP le des formato xHTML o lo que corresponda en su salida (así de paso optimizas el espacio en tus BD)

Un saludo,
  #7 (permalink)  
Antiguo 01/10/2004, 12:27
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 14 años, 2 meses
Puntos: 4
si a alguen le sirve les dejo esta funcion que debuelbe un substring con la cantidad de la palabras que le indiquemos ademas de poder especificar un offset.

Código PHP:
function wordcut($texto,$wini,$wcant){
    
$wordsout="";
    
$arraywords split(" ",$texto);
    while( (
$xword $arraywords[$wini]) and $wcant ){
        
$wordsout .= "$xword ";
        
$wini++;
        
$wcant--;
    }
    return 
$wordsout;

Sintaxis wordcut($textoacortar,$palabradeinicio,$cantidadde palabras);
$textoacortar: es el texto de entrada, el cual sera cortado.
$palabradeinicio: la palabra en la que inicia el corte(a lo que yo llamo offset) tomando en cuenta que 0 es la primera palabra.
$cantidaddepalabras: cantidad de palabras que se van a extraer a partir del offset.

un ejemplo:
$cadena = "La consultora Gartner aventura un audaz comentario respecto a la seguridad del sistema operativo Windows.";
echo wordcut($cadena,2,7); //imprime Gartner aventura un audaz comentario respecto a la

ojala les sirva.

Última edición por xcorpion; 01/10/2004 a las 12:34
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 10:12.