web-dev-qa-db-fra.com

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

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

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

Pour ajouter la prise en charge d'autres sauts de mots comme les virgules et les tirets, preg_match donne un moyen rapide et ne nécessite pas de fractionner 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 UTF-8 ou Unicode, donc si c'est un problème, vous pouvez remplacer \w pour [^\s,\.;\?\!] et \W pour [\s,\.;\?\!].

124
Kelly

Le simple fractionnement sur des espaces ne fonctionnera pas correctement s'il y a un caractère inattendu à la place d'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 n'importe quel caractère 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 flexible ou strict que vous le souhaitez. Il faut cependant être prudent. J'ai spécifiquement abordé ce qui précède en ciblant les écarts entre les mots - plutôt que les mots eux-mêmes - car il est assez difficile d'énoncer sans équivoque ce qui définira un mot.

Prendre la \w Mot limite ou son inverse \W. Je m'appuie rarement sur ceux-ci, principalement parce que - selon le logiciel que vous utilisez (comme certaines versions de PHP) - ils n'incluent pas toujours les caractères UTF-8 ou Unicode .

Dans les expressions régulières, il vaut mieux être précis à tout moment. Pour que vos expressions puissent gérer des choses comme les suivantes, peu importe où elles sont rendues:

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

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

Éviter le fractionnement pourrait cependant être utile en termes de performances. Vous pouvez donc utiliser l'approche mise à jour de Kelly, mais basculez \w pour [^\s,\.;\?\!]+ et \W pour [\s,\.;\?\!]+. Bien que, personnellement, j'aime la simplicité de l'expression de fractionnement utilisée ci-dessus, elle est plus facile à lire et donc à modifier. La pile de PHP sont cependant un peu moches :)

52
Pebbl

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

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 affichera:

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

Utilisez une boucle pour obtenir les mots que vous voulez.

Source: http://php.net/str_Word_count

3
jawira

Cela peut facilement être fait en utilisant str_Word_count()

$first10words = implode(' ', array_slice(str_Word_count($sentence,1), 0, 10));
2
Rowlingso

Pour sélectionner 10 mots du texte donné, vous pouvez implémenter 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;
}
2
Milad

Cela pourrait vous aider. Fonction pour retourner N no. de mots

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 "";
    }
}
1
Ankur Rastogi

Essaye ça

$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]. " ";
}

Je sais que ce n'est pas le moment de répondre, mais laissez les nouveaux venus choisir leurs propres réponses.

1
saleem ahmed
    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);
    }

Utilisez-le comme ceci:

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

Sortie: Lorem ipsum dolor sit amet

Cette fonction fonctionne également très bien avec les caractères unicode comme les caractères arabes.

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

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

0
Amr

C'est totalement ce que nous recherchons. Il suffit de couper et coller dans votre programme et de l'exécuter.

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

et il suffit d'appeler la fonction dans votre bloc de code comme

$data_itr = shorten_string($Itinerary,25);
0
Rizwan Gill

Cela pourrait vous aider. Fonction à retourner 1no. 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);
0
rowmoin

Je le fais de cette façon:

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

Sa compatibilité UTF8 ...

0
Vaci