Как да избера само първите 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];
}
Както Pebbl споменава, PHP не се справя добре с UTF-8 или Unicode, така че ако това ви притеснява, можете да замените \w
за [^\s,\.;\?\!]
и \W
за [\s,\.;\?\!]
.
Microsoft има справочен документ с техните конвенции за кодиране, които може да са полезни за разглеждане, дори ако не използвате C#. Отвъд стила и основните конвенции, книги с най-добри практики, препоръчани от други тук, като Clean Code са основно четиво за създаване на поддържаем, четим код, който ще има смисъл за бъдещите поддържащи вашата кодова база.
Ако използвате Visual Studio (и някои други съвременни IDE), основните несъответствия с препоръчаните конвенции се подчертават автоматично (с предложения при задържане на курсора на мишката в последните версии на VS). Във VS, ако вашият екип иска да използва различни стандарти, просто отворете свойствата на проекта и променете настройките за „Анализ на кода“ (последният елемент от лявото меню). Повече тук: Използване на набори от правила за групиране на правила за анализ на код
- person Pebbl; 03.04.2015<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]. " ";
}
Знам, че не е време за отговор, но нека новодошлите сами да изберат своите отговори.
Това е напълно това, което търсим. Просто изрежете 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);
Аз го правя по следния начин:
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