2011-05-10 16 views
44

¿Cómo selecciono, a partir de una salida, solo las primeras 10 palabras?¿Cómo seleccionar las primeras 10 palabras de una oración?

+0

Usted podría encuentre ['s ($ str) -> words (10)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d4 3adaa899642c1cce047e076dc/src/Str.php # L363) útil, como se encuentra en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

113
implode(' ', array_slice(explode(' ', $sentence), 0, 10)); 

para añadir soporte para otras separaciones de palabras como las comas y los guiones, preg_match da una manera rápida y no requiere la división de la cadena:

function get_words($sentence, $count = 10) { 
    preg_match("/(?:\w+(?:\W+|$)){0,$count}/", $sentence, $matches); 
    return $matches[0]; 
} 

Como Pebbl menciona que PHP no maneja bien UTF-8 o Unicode, así que si eso es una preocupación, entonces puede reemplazar \w por [^\s,\.;\?\!] y \W para [\s,\.;\?\!].

+0

Esto funcionó muy bien para mí. Necesitaba mostrar solo las primeras 5 frases, así que cambié el 10 a un 5, luego cambié el '' a ''. 'en la implosión y explosión y funcionó bien. Tuve que poner un punto después de mostrar el texto porque se omitió el último período. Gracias. – NotJay

+0

¡Buena actualización, +1 para evitar la división (y el uso de expresiones regulares!). Sin embargo, querrás tener cuidado con los límites de las palabras según mi respuesta actualizada. – Pebbl

+1

Desafortunadamente, PHP aún no ha descubierto cómo manejar Unicode. Gracias por la información, actualicé mi respuesta. – Kelly

6

http://snipplr.com/view/8480/a-php-function-to-return-the-first-n-words-from-a-string/

function shorten_string($string, $wordsreturned) 
{ 
    $retval = $string; // Just in case of a problem 
    $array = explode(" ", $string); 
    /* Already short enough, return the whole thing*/ 
    if (count($array)<=$wordsreturned) 
    { 
     $retval = $string; 
    } 
    /* Need to chop of some words*/ 
    else 
    { 
     array_splice($array, $wordsreturned); 
     $retval = implode(" ", $array)." ..."; 
    } 
    return $retval; 
} 
48

Simplemente dividir en espacios funcionará incorrectamente si hay un carácter inesperado en lugar de un espacio en la estructura de la oración, o si la oración contiene múltiples espacios combinados.

La siguiente versión funcionará sin importar qué tipo de "espacio" utilice entre palabras y se puede extender fácilmente para manejar otros caracteres ... actualmente es compatible con cualquier carácter de espacio en blanco más,. ; ? !

function get_snippet($str, $wordCount = 10) { 
    return implode( 
    '', 
    array_slice( 
     preg_split(
     '/([\s,\.;\?\!]+)/', 
     $str, 
     $wordCount*2+1, 
     PREG_SPLIT_DELIM_CAPTURE 
    ), 
     0, 
     $wordCount*2-1 
    ) 
); 
} 

Las expresiones regulares son perfectas para este problema, porque puede hacer que el código sea tan flexible o estricto como desee. Sin embargo, debes tener cuidado. Específicamente, me acerqué a lo anterior para identificar las brechas entre las palabras — en lugar de las palabras mismas — porque es bastante difícil establecer inequívocamente qué definirá una palabra.

Tome el \w límite de palabras, o su \W inverso. Raramente dependo de estos, principalmente porque — dependiendo del software que está usando (como ciertas versiones de PHP) — they don't always include UTF-8 or Unicode characters.

En expresiones regulares, es mejor ser específico, en todo momento. Para que sus expresiones pueden manejar cosas como la siguiente, sin importar dónde se prestan:

echo get_snippet('Это не те дроиды, которые вы ищете', 5); 

/// outputs: Это не те дроиды, которые 

Evitar que partía podría valer la pena, sin embargo, en términos de rendimiento. De modo que podría usar el enfoque actualizado de Kelly, pero cambie \w por [^\s,\.;\?\!]+ y \W por [\s,\.;\?\!]+. Aunque, personalmente, me gusta la simplicidad de la expresión de división utilizada anteriormente, es más fácil de leer y, por lo tanto, modificar. La pila de funciones de PHP, sin embargo, es un poco fea :)

+3

+1 ¿Por qué fue esto a 0 votos? Es una mejor solución que las otras respuestas. Aunque, las personas no deberían usar camel case en PHP. –

+0

@StephenSarcsamKamenar gracias ... y buen punto, he estado haciendo demasiadas javascripting ese día :) – Pebbl

+0

Estoy de acuerdo con la pregunta de @ StephenSarcsamKamenar! Supongo que hay dos respuestas aquí. Es un deber del que hizo la pregunta para actualizar la respuesta correcta. Esto es lo mejor para mí: ¡+1 sin dudas! – JeanValjean

1

Esto podría ayudarlo. Función para devolver N no. de las palabras

public function getNWordsFromString($text,$numberOfWords = 6) 
{ 
    if($text != null) 
    { 
     $textArray = explode(" ", $text); 
     if(count($textArray) > $numberOfWords) 
     { 
      return implode(" ",array_slice($textArray, 0, $numberOfWords))."..."; 
     } 
     return $text; 
    } 
    return ""; 
    } 
} 
0

Es totalmente lo que estamos buscando acaba de cortar n pegar en su programa y corrieron.

function shorten_string($string, $wordsreturned) 
/* Returns the first $wordsreturned out of $string. If string 
contains fewer words than $wordsreturned, the entire string 
is returned. 
*/ 
{ 
$retval = $string;  // Just in case of a problem 

$array = explode(" ", $string); 
if (count($array)<=$wordsreturned) 
/* Already short enough, return the whole thing 
*/ 
{ 
$retval = $string; 
} 
else 
/* Need to chop of some words 
*/ 
{ 
array_splice($array, $wordsreturned); 
$retval = implode(" ", $array)." ..."; 
} 
return $retval; 
} 

y simplemente llamar a la función en el bloque de código al igual que

$data_itr = shorten_string($Itinerary,25); 
2

Es mejor utilizar str_word_count:

<?php 
$str = "Lorem ipsum  dolor sit amet, 
     consectetur  adipiscing elit"; 
print_r(str_word_count($str, 1)); 
?> 

El resultado del ejemplo sería:

Array 
(
    [0] => Lorem 
    [1] => ipsum 
    [2] => dolor 
    [3] => sit 
    [4] => amet 
    [5] => consectetur 
    [6] => adipiscing 
    [7] => elit 
) 

El uso un bucle para obtener las palabras que desea.

Fuente: http://php.net/str_word_count

0

lo hago de esta manera:

function trim_by_words($string, $word_count = 10) { 
    $string = explode(' ', $string); 
    if (empty($string) == false) { 
     $string = array_chunk($string, $word_count); 
     $string = $string[0]; 
    } 
    $string = implode(' ', $string); 
    return $string; 
} 

Su UTF8 compatibles ...

-4

que no entiendo por qué todo este lío cuando hay un built-in función de Wordpress:

<?= wp_trim_words(get_the_content(), 15, '...') ?> 

Eso hace eco de las primeras 15 palabras de contenido (que funciona en el interior un bucle regular) y agrega puntos suspensivos.

0

Esto podría ayudarlo. Función para devolver no. of words.

function num_of_word($text,$numb) { 
$wordsArray = explode(" ", $text); 
$parts = array_chunk($wordsArray, $numb); 

$final = implode(" ", $parts[0]); 

if(isset($parts[1])) 
    $final = $final." ..."; 
return $final; 
return; 
} 
echo num_of_word($text, 10); 
1

probar este

$str = 'Lorem ipsum dolor sit amet,consectetur adipiscing elit. Mauris ornare luctus diam sit amet mollis.'; 
$arr = explode(" ", str_replace(",", ", ", $str)); 
for ($index = 0; $index < 10; $index++) { 
echo $arr[$index]. " "; 
} 

Sé que esto no es tiempo para responder, pero vamos a los recién llegados eligen sus propias respuestas.

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 los caracteres Unicode como caracteres árabes.

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

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

2

Para seleccionar 10 palabras del texto dado puede implementar la función siguiente:

function first_words($text, $count=10) 
{ 
    $words = explode(' ', $text); 

    $result = ''; 
    for ($i = 0; $i < $count && isset($words[$i]); $i++) { 
     $result .= $words[$i]; 
    } 

    return $result; 
} 
2

Esto se puede hacer fácilmente usando str_word_count()

$first10words = implode(' ', array_slice(str_word_count($sentence,1), 0, 10)); 
+0

[Enlace a la documentación] (http://php.net/manual/en/function.str-word-count.php) –

Cuestiones relacionadas