Как выделить первые 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];
}

Как упоминает Пеббл, PHP не очень хорошо обрабатывает UTF-8 или Unicode, поэтому, если это вас беспокоит, вы можете заменить \w на [^\s,\.;\?\!] и \W на [\s,\.;\?\!].

person Kelly    schedule 10.05.2011
comment
Это отлично сработало для меня. Однако мне нужно было отобразить только первые 5 предложений, поэтому я заменил 10 на 5, а затем переключил '' на '. ' при взрыве и взрыве, и это сработало просто отлично. Мне пришлось поставить точку после того, как я отобразил текст, потому что последняя точка была опущена. Спасибо. - person NotJay; 21.11.2013
comment
Хорошее обновление, +1 за избегание разбиения (и использование регулярных выражений!). Однако вы должны следить за этими границами слов, согласно моему обновленному ответу. - 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

Это именно то, что мы ищем. Просто вырезайте и вставляйте в свою программу и запускайте.

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