2009-07-11 26 views
7

Esto es lo que estoy tratando de hacer. Tengo un bloque de texto y me gustaría extraer las primeras 50 palabras de la cadena sin cortar las palabras en el medio. Es por eso que preferiría las palabras que se oponen a los caracteres, entonces podría usar una función left().¿Cómo obtengo solo un determinado número de palabras de una cadena en php?

Sé que la función str_word_count ($ var) devolverá el número de palabras en una cadena, pero ¿cómo devolveré solo las primeras 50 palabras?

Estoy inmerso en PHP y todavía no estoy familiarizado con muchas de las funciones de cadenas.

Gracias de antemano, Jason

Respuesta

15

I recomendaría no usar la cantidad de palabras como línea de base. Podría fácilmente terminar con mucho menos o mucho más datos de lo que pensaba mostrar.

Un enfoque que he usado en el pasado es pedir la longitud deseada, pero asegúrese de que no trunque una palabra. Aquí hay algo que puede funcionar para usted:

function function_that_shortens_text_but_doesnt_cutoff_words($text, $length) 
{ 
    if(strlen($text) > $length) { 
     $text = substr($text, 0, strpos($text, ' ', $length)); 
    } 

    return $text; 
} 

Dicho esto, si pasa 1 como segundo parámetro a str_word_count, devolverá una matriz que contiene todas las palabras, y se puede usar la manipulación de matrices en eso. Además, podría aunque, es algo hackey, explotar la cadena en espacios, etc. Pero eso introduce mucho margen de error, como cosas que no son palabras que se cuentan como palabras.

PS. Si necesita una versión segura de Unicode de la función anterior y tiene las extensiones mbstring o iconv instaladas, simplemente reemplace todas las funciones de cadena con sus equivalentes prefijados mb_ o iconv_.

+0

Todas las respuestas son de calidad, pero usted explicó por qué debería usar caracteres en lugar de palabras. ¡Gracias! – JasonBartholme

+0

Por cierto, no aborda la situación en la que no hay espacio en los primeros caracteres '$ length', y aún puede terminar con * mucho * menos datos de los que pretendía mostrar si el único espacio está en el cuarto personaje más o menos (ver mi respuesta para la solución). – Zarel

+0

Honestamente, para lo que he usado este método, eso nunca sería un problema. Buen punto, sin embargo. – jason

8

str_word_count toma un parámetro opcional que le dice qué volver.

Devuelve una matriz de cadenas que son las palabras:

$words = str_word_count($var, 1); 

Entonces es posible dividir las cosas con algo como:

$len = min(50, count($words)); 
$first_fifty = array_slice($words, 0, $len); 
3

¿Estás seguro que quieres un cierto número de palabras? Si estás haciendo algo así como una "vista previa", por lo general es mejor hacer algo así como "Hasta 300 caracteres, cortado en un límite de palabra", en cuyo caso se puede usar algo como:

if (strlen($str)>300) 
{ 
    $str = substr($str,0,300); 
    $pos = strrpos($str, ' '); 
    if ($pos !== false && $pos > 200) // If there is no space in the last 100 chars, just truncate 
    $str = substr($str,0,$pos); 
    // You may also want to add ellipses: 
    // $str .= '...'; 
} 
+0

Hola, quienquiera modded por mi respuesta, que podría explicar lo que está mal con él? Admito que no es tan detallado como la respuesta de Jason, pero no veo nada de malo en eso ... – Zarel

+0

Tienes mi voto, pero ¿olvidas qué hacer si no hay espacio? – Thinker

+0

En realidad, abordé esa situación. Lo he editado para comentar la línea específica en la que lo hago. – Zarel

2

he encontrado manera más fácil de hacer esto:

function get_len_of_word($str,$number) { $array_str = explode(" ", $str); if(isset($array_str[$number])) { return implode(" ",array_slice($array_str, 0, $number)); } return $str; }

1

Aquí es un ejemplo más,

function getWordsFromString($str,$word_count) 
{ 
    $new_str=$str; 
    $_strArr=explode(" ",$str); 
    $_tempArr=array(); 
    if(count($_strArr)>$word_count) 
    { 
     foreach ($_strArr as $key=> $value) { 
      $_tempArr[]=$value; 
      if($key==$word_count-1) 
      { 
       $new_str=implode(" ",$_tempArr).' ...'; 
      } 
     } 
    } 
    return $new_str; 
} 
0
function get_first_num_of_words($string, $num_of_words) 
    { 
     $string = preg_replace('/\s+/', ' ', trim($string)); 
     $words = explode(" ", $string); // an array 

     // if number of words you want to get is greater than number of words in the string 
     if ($num_of_words > count($words)) { 
      // then use number of words in the string 
      $num_of_words = count($words); 
     } 

     $new_string = ""; 
     for ($i = 0; $i < $num_of_words; $i++) { 
      $new_string .= $words[$i] . " "; 
     } 

     return trim($new_string); 
    } 

utilizar de esta manera:

echo get_first_num_of_words("Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid, illo?", 5); 

Salida: Lorem ipsum dolor sit amet

Esta función también funciona muy bien con caracteres Unicode como los caracteres árabes.

echo get_first_num_of_words("نموذج لنص عربي الغرض منه توضيح كيف يمكن استخلاص أول عدد معين من الكلمات الموجودة فى نص معين.", 100); 

Salida: نموذج لنص عربي الغرض منه توضيح كيف يمكن استخلاص أول عدد معين من الكلمات الموجودة فى نص معين.

Cuestiones relacionadas