Как получить первые x символов из строки, не обрезая последнее слово?

У меня есть следующая строка в переменной.

Stack Overflow is as frictionless and painless to use as we could make it.

Я хочу получить первые 28 символов из приведенной выше строки, поэтому обычно, если я используюзиЬзЬг тогда это даст мнеStack Overflow is as frictio это вывод, но я хочу вывод как:

Stack Overflow is as...

Есть ли в PHP какая-либо готовая функция для этого, или, пожалуйста, предоставьте мне код для этого в PHP?

Edited:

Я хочу, чтобы в строке было всего 28 символов, не разбив ни слова, если он вернет мне на несколько символов меньше, чем 28, не разбив ни слова, это нормально.

 Prashant09 июл. 2009 г., 17:05
@Miky D, раньше я думал, что это будет более понятным на примере, в любом случае редактировал пост.
 Mike Dinescu09 июл. 2009 г., 16:48
Тогда убедитесь, что это четко указано в вопросе!
 Prashant09 июл. 2009 г., 16:47
Да, я хочу, чтобы всего было 28 символов ... без разбивки слов, если он вернет мне на несколько меньше символов, чем 28, без разбития слов, это нормально ...
 Sinan Ünür09 июл. 2009 г., 16:45
То есть вам не нужны первые 28 символов, а первые несколько слов длиной до 28. Это правильно?
 edCoder29 сент. 2014 г., 13:40
Попробуйте эту ссылку, может помочь вамstackoverflow.com/a/26098951/3944217

Ответы на вопрос(13)

Решение Вопроса

wordwrap() функции, затем взорваться на новой строке и принять первую часть:

$str = wordwrap($str, 28);
$str = explode("\n", $str);
$str = $str[0] . '...';
 20 нояб. 2011 г., 15:21
Не могли бы вы использоватьstr_word_count(uk3.php.net/manual/en/function.str-word-count.php) проверить содержимое, затем перейти к следующему$str[] элемент, если он возвращает0?
 03 мар. 2015 г., 23:08
Есть ли подобная функция дляwords вместо персонажей?
 10 мар. 2013 г., 10:51
Я пометил это как ответ, потому что он кажется лучшим, и моя проблема решена на 100%. Спасибо @Greg
 Prashant25 февр. 2010 г., 07:20
Я отметил это как ответ, но это создает проблему, когда я используюstrip_tags для строки. У меня есть строка расширенного текста (включая HTML-теги), и я хочуstrip_tags из этой строки, а затем получить фиксированное количество символов. Но тогда его возвращение пустым, потому что я думаю сstrip_tags($str) Исчезает все/n из-за чего взорвать не удалось взорвать строку должным образом и он возвращает пустую строку. Любое решение этой проблемы?

сива?

substr($string,0,strrpos(substr($string,0,28),' ')).'...';

AlfaSky:

function addEllipsis($string, $length, $end='…')
{
    if (strlen($string) > $length)
    {
        $length -= strlen($end);
        $string  = substr($string, 0, $length);
        $string .= $end;
    }

    return $string;
}

Альтернативная, более интересная реализация отБлог Эллиотта Брюггемана:

/**
 * trims text to a space then adds ellipses if desired
 * @param string $input text to trim
 * @param int $length in characters to trim to
 * @param bool $ellipses if ellipses (...) are to be added
 * @param bool $strip_html if html tags are to be stripped
 * @return string 
 */
function trim_text($input, $length, $ellipses = true, $strip_html = true) {
    //strip tags, if desired
    if ($strip_html) {
        $input = strip_tags($input);
    }

    //no need to trim, already shorter than trim length
    if (strlen($input) <= $length) {
        return $input;
    }

    //find last space within length
    $last_space = strrpos(substr($input, 0, $length), ' ');
    $trimmed_text = substr($input, 0, $last_space);

    //add ellipses (...)
    if ($ellipses) {
        $trimmed_text .= '...';
    }

    return $trimmed_text;
}

(Поиск Google: & quot; эллипсы обрезки php & quot;)

струнный токенизатор разбить строку на слова так:

$string = "Stack Overflow is as frictionless and painless to use as we could make it.";
$tokenized_string = strtok($string, " ");

Тогда вы можете вытащить отдельные слова так, как вы хотите.

Изменить: Грег имеет гораздо лучший и элегантный способ делать то, что вы хотите. Я бы пошел с его решением WordWrap ().

<?php 
$title = "this is the title of my website!";
$number_of_characters = 15;
echo substr($title, 0, strrpos(substr($title, 0, $number_of_characters), " "));
?>
substr("some string", 0, x);

Руководство по PHP

 09 июл. 2009 г., 17:28
Прокрутите вниз до расширенной версии.us.php.net/manual/en/function.substr.php#73233
 Prashant09 июл. 2009 г., 16:48
Да, но с помощью этого слова иногда ломаются ... и я упомянул в своем вопросе, что substr не делает то, что я хочу, пожалуйста, прочитайте вопрос еще раз :)

$string='Stack Overflow is as frictionless and painless to use as we could make it.';
$n=28;
$break=strpos(wordwrap($string, $n,'<<||>>'),'<<||>>');
print substr($string,0,($break==0?strlen($string):$break)).(strlen($string)>$n?'...':'');

$string='Stack Overflow';
$n=28;
$break=strpos(wordwrap($string, $n,'<<||>>'),'<<||>>');
print substr($string,0,($break==0?strlen($string):$break)).(strlen($string)>$n?'...':'');

$str = "Stack Overflow is as frictionless and painless to use as we could make it.";

$strMax = 28;
$strTrim = ((strlen($str) < $strMax-3) ? $str : substr($str, 0, $strMax-3)."...");

//or this way to trim to full words
$strFull = ((strlen($str) < $strMax-3) ? $str : strrpos(substr($str, 0, $strMax-3),' ')."...");
function truncate( $string, $limit, $break=" ", $pad="...") {

 // return with no change if string is shorter than $limit
 if(strlen($string) <= $limit){
    return $string;
 }

 $string = substr($string, 0, $limit);
 if(false !== ($breakpoint = strrpos($string, $break))){
    $string = substr($string, 0, $breakpoint);
 }
 return $string . $pad;
}

function WordLimt($Keyword,$WordLimit){

    if (strlen($Keyword)<=$WordLimit) { return $Keyword; }
    $Keyword= substr($Keyword,0,strrpos(substr($Keyword,0,$WordLimit),' '));
    return $Keyword;
}

echo WordLimt($MyWords,28);

// OutPut : Stack Overflow is as

он будет настраиваться и ломаться на последнем Space без срезанного слова ...

перенос слова.

string wordwrap  ( string $str  [, int $width= 75  [, string $break= "\n"  [, bool $cut= false  ]]] )

-

function firstNChars($str, $n) {
  return array_shift(explode("\n", wordwrap($str, $n)));
}

echo firstNChars("bla blah long string", 25) . "...";

отказ от ответственности: не проверял это.

Кроме того, если ваша строка содержит\nс, это может сломаться раньше.

если в вашей строке есть теги html, & nbsp и несколько пробелов. Вот что я использую, чтобы позаботиться обо всем:

function LimitText($string,$limit,$remove_html=0){
    if ($remove_html==1){$string=strip_tags($string);}
    $newstring = preg_replace("/(?:\s|&nbsp;)+/"," ",$string, -1); // replace &nbsp with space
    $newstring = preg_replace(array('/\s{2,}/','/[\t\n]/'),' ',$newstring); // replace duplicate spaces
    if (strlen($newstring)<=$limit) { return $newstring; } // ensure length is more than $limit
    $newstring = substr($newstring,0,strrpos(substr($newstring,0,$limit),' '));
    return $newstring;
}

использование:

$string = 'My wife is jealous of stackoverflow';
echo LimitText($string,20);
// My wife is jealous

Использование с HTML:

$string = '<div><p>My wife is jealous of stackoverflow</p></div>';
echo LimitText($string,20,1);
// My wife is jealous

Ваш ответ на вопрос