Как мне из вывода выбрать только первые 10 слов?
Как выделить первые 10 слов предложения?
Ответы (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,\.;\?\!]
.
<p>
? это не работает со строкой, которая html в теме...
- person Mostafa; 13.09.2018
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 немного уродлив :)
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;
}
Я предлагаю использовать 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.
Чтобы выбрать 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;
}
Это легко сделать с помощью str_word_count()
$first10words = implode(' ', array_slice(str_word_count($sentence,1), 0, 10));
Это может помочь вам. Функция для возврата 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 "";
}
}
Попробуй это
$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]. " ";
}
Я знаю, что сейчас не время отвечать, но пусть новички сами выбирают ответы.
Это именно то, что мы ищем. Просто вырезайте и вставляйте в свою программу и запускайте.
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);
Я делаю это так:
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...
Это может помочь вам. Функция для возврата 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);
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);
Выход: نموذج لنص عربي الغرض منه توضيح كيف يمكن استخلاص أول عدد معين من الكلمات الموجودة فى نص معين.
Я не понимаю, зачем весь этот беспорядок, когда есть встроенная функция Wordpress:
<?= wp_trim_words(get_the_content(), 15, '...') ?>
Это повторяет первые 15 слов содержимого (это работает внутри обычного цикла) и добавляет многоточие.
s($str)->words(10)
, как в этой отдельной библиотеке. - person caw   schedule 27.07.2016