Как да изберете първите 10 думи от изречението?

Как да избера само първите 10 думи от резултат?


person AAA    schedule 10.05.2011    source източник
comment
Може да намерите s($str)->words(10) полезен, както се намира в тази самостоятелна библиотека.   -  person caw    schedule 27.07.2016


Отговори (13)


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

За да добавите поддръжка за други разделяния на думи като запетаи и тирета, preg_match дава бърз начин и не изисква разделяне на низа:

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

Както Pebbl споменава, PHP не се справя добре с UTF-8 или Unicode, така че ако това ви притеснява, можете да замените \w за [^\s,\.;\?\!] и \W за [\s,\.;\?\!].

person Kelly    schedule 10.05.2011
comment
Това работи чудесно за мен. Трябваше обаче да покажа само първите 5 изречения, така че превключих 10 на 5, след което превключих „ “ на “. “ в implode и explode и работи добре. Трябваше да сложа точка, след като показах текста, защото последната точка беше пропусната. Благодаря ти. - person NotJay; 21.11.2013
comment

Microsoft има справочен документ с техните конвенции за кодиране, които може да са полезни за разглеждане, дори ако не използвате C#. Отвъд стила и основните конвенции, книги с най-добри практики, препоръчани от други тук, като Clean Code са основно четиво за създаване на поддържаем, четим код, който ще има смисъл за бъдещите поддържащи вашата кодова база.

Ако използвате Visual Studio (и някои други съвременни IDE), основните несъответствия с препоръчаните конвенции се подчертават автоматично (с предложения при задържане на курсора на мишката в последните версии на VS). Във VS, ако вашият екип иска да използва различни стандарти, просто отворете свойствата на проекта и променете настройките за „Анализ на кода“ (последният елемент от лявото меню). Повече тук: Използване на набори от правила за групиране на правила за анализ на код

- person Pebbl; 03.04.2015
comment
Жалко е, че PHP все още не е разбрал как да работи с Unicode -- благодаря за информацията, актуализирах отговора си. - person Kelly; 03.04.2015
comment
благодаря ви много!!, това проработи на моя сайт с WPIMPORTALL, за да изберете само първите 6 букви. Освен това Unicode беше отлична добавка!! чудесен - person ingalcala; 29.02.2016
comment
Как да върнем 10 свята, ако нашият низ има <p>? това не работи с низ, който html в темата... - person Mostafa; 13.09.2018
comment
Ще трябва да премахнете html от низа. Опитайте да използвате strip_tags. - person Kelly; 19.09.2018

Простото разделяне на интервали ще функционира неправилно, ако има неочакван знак на мястото на интервал в структурата на изречението или ако изречението съдържа множество свързани интервали.

Следващата версия ще работи без значение какъв вид "интервал" използвате между думите и може лесно да бъде разширена, за да обработва други знаци... в момента поддържа всеки празен интервал плюс , . ; ? !

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

Регулярните изрази са идеални за този проблем, защото можете лесно да направите кода толкова гъвкав или строг, колкото искате. Все пак трябва да сте внимателни. Специално подходих към горното, насочвайки се към пропуските между думите, а не към самите думи, защото е доста трудно да се каже недвусмислено какво ще дефинира една дума.

Вземете \w границата на думата или нейната обратна \W. Рядко разчитам на тях, главно защото в зависимост от софтуера, който използвате (като определени версии на PHP) те не винаги включват UTF-8 или Unicode знаци.

В регулярните изрази е по-добре да сте конкретни по всяко време. Така че вашите изрази да могат да обработват неща като следните, независимо къде са изобразени:

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

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

Избягването на разделянето обаче може да си струва по отношение на ефективността. Така че можете да използвате актуализирания подход на Кели, но да смените \w за [^\s,\.;\?\!]+ и \W за [\s,\.;\?\!]+. Въпреки че лично аз харесвам простотата на израза за разделяне, използван по-горе, той е по-лесен за четене и следователно за модифициране. Купчината от PHP функции обаче е малко грозна :)

person Pebbl    schedule 16.09.2012
comment
+1 Защо това беше 0 гласа? Това е по-добро решение от другите отговори. Въпреки това, хората не трябва да използват камилски регистър в PHP. - person Farzher; 21.09.2012
comment
@StephenSarcsamKamenar благодаря... и добра бележка, правех твърде много javascript този ден :) - person Pebbl; 13.10.2012
comment
Съгласен съм с въпроса на @StephenSarcsamKamenar! Предполагам, че тук има два отговора. Задължение на този, който е задал въпроса, е да актуализира правилния отговор. Това е най-доброто за мен: +1 без съмнение! - person JeanValjean; 05.12.2012
comment
Страхотен отговор. Бих искал обаче да добавя към отговора, че може да се наложи да използвате trim() около вашия $str, преди да го обработите. По този начин елиминирате всяко празно пространство в ъглите. Това би помогнало, ако искате да проверите дали искате да добавите многоточия в края на низа, ако полученият низ е подмножество на оригинала. - person Greeso; 04.05.2016

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;
}
person Spyros    schedule 10.05.2011

Предлагам да използвате str_word_count:

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

Горният пример ще изведе:

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

Използвайте цикъл, за да получите думите, които искате.

Източник: http://php.net/str_word_count

person jawira    schedule 10.12.2014

За да изберете 10 думи от дадения текст, можете да приложите следната функция:

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

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

    return $result;
}
person Milad Rahimi    schedule 15.02.2017

Това може лесно да се направи с помощта на str_word_count()

$first10words = implode(' ', array_slice(str_word_count($sentence,1), 0, 10));
person Rowlingso    schedule 10.05.2017

Това може да ви помогне. Функция за връщане на N бр. от думи

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 "";
    }
}
person Ankur Rastogi    schedule 04.03.2014

Опитайте тази

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

Знам, че не е време за отговор, но нека новодошлите сами да изберат своите отговори.

person saleem ahmed    schedule 19.11.2015

Това е напълно това, което търсим. Просто изрежете n, поставено във вашата програма и стартирайте.

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

и просто извикайте функцията във вашия блок код точно както

$data_itr = shorten_string($Itinerary,25);
person Rizwan Gill    schedule 09.12.2014

Аз го правя по следния начин:

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

Неговият UTF8 съвместим...

person Vaci    schedule 05.03.2015

Това може да ви помогне. Функция за връщане на 10 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);
person rowmoin    schedule 18.11.2015

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

Използвайте го така:

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

Резултат: Lorem ipsum dolor sit amet

Тази функция също работи много добре с уникод знаци като арабски знаци.

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

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

person Amr    schedule 23.11.2015

Не разбирам защо цялата тази бъркотия, когато има вградена функция на Wordpress:

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

Това отразява първите 15 думи от съдържанието (работи в нормален цикъл) и добавя многоточие.

person Fred K    schedule 03.08.2015