51 votes

Comment sélectionner les 10 premiers mots d'une phrase ?

Comment puis-je, à partir d'une sortie, ne sélectionner que les 10 premiers mots ?

134voto

Kelly Points 8780
implode(' ', array_slice(explode(' ', $sentence), 0, 10));

Pour ajouter la prise en charge d'autres coupures de mots comme les virgules et les tirets, preg_match offre un moyen rapide et ne nécessite pas de diviser la chaîne :

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

Comme le mentionne Pebbl, PHP ne gère pas très bien l'UTF-8 ou l'Unicode, donc si c'est un souci, vous pouvez remplacer \w para [^\s,\.;\?\!] y \W para [\s,\.;\?\!] .

52voto

pebbl Points 8909

Le simple fractionnement sur les espaces ne fonctionnera pas correctement si un caractère inattendu remplace un espace dans la structure de la phrase, ou si la phrase contient plusieurs espaces conjoints.

La version suivante fonctionnera quel que soit le type d'"espace" que vous utilisez entre les mots et peut être facilement étendue pour gérer d'autres caractères... elle prend actuellement en charge tous les caractères d'espace blanc plus , . ; ? !

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
    )
  );
}

Les expressions régulières sont parfaites pour ce problème, car vous pouvez facilement rendre le code aussi souple ou strict que vous le souhaitez. Il faut cependant être prudent. J'ai spécifiquement abordé la question ci-dessus en ciblant les espaces entre les mots - plutôt que les mots eux-mêmes - parce qu'il est plutôt difficile d'affirmer sans équivoque ce qui définira un mot.

Prenez le \w limite du mot, ou son inverse \W . Je m'y fie rarement, principalement parce que, en fonction du logiciel que vous utilisez (comme certaines versions de PHP), il est possible que vous ayez besoin d'une aide supplémentaire. ils n'incluent pas toujours les caractères UTF-8 ou Unicode .

Dans les expressions régulières, il est préférable d'être précis, à tout moment. Ainsi, vos expressions peuvent traiter des éléments comme ceux qui suivent, quel que soit l'endroit où ils sont rendus :

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

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

Éviter le fractionnement pourrait toutefois être intéressant en termes de performances. Vous pourriez donc utiliser l'approche mise à jour de Kelly, mais en remplaçant \w para [^\s,\.;\?\!]+ y \W para [\s,\.;\?\!]+ . Bien que, personnellement, j'aime la simplicité de l'expression de division utilisée ci-dessus, elle est plus facile à lire et donc à modifier. La pile de fonctions PHP est cependant un peu moche :)

7voto

Spyros Points 13741

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;
}

3voto

jawira Points 357

Je suggère d'utiliser str_word_count :

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

L'exemple ci-dessus produira un résultat :

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

L'utilisation d'une boucle pour obtenir les mots que vous voulez.

Fuente: http://php.net/str_word_count

2voto

Milad Points 991

Pour sélectionner 10 mots d'un texte donné, vous pouvez utiliser la fonction suivante :

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

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

    return $result;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X