Получить первые 100 символов из строки, соблюдая полные слова - PullRequest
64 голосов
/ 09 июня 2009

Я уже задавал подобный вопрос здесь раньше, но мне нужно знать, возможен ли этот маленький твик. Я хочу сократить строку до 100 символов и использовать $small = substr($big, 0, 100); для этого. Однако, это просто берет первые 100 символов и не заботится, разбивает ли это слово или нет.

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

Пример:

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!"

$small = some_function($big);

echo $small;

// OUTPUT: "This is a sentence that has more than 100 characters in it, and I want to return a string of only"

Есть ли способ сделать это с помощью PHP?

Ответы [ 18 ]

123 голосов
/ 05 января 2011

Все, что вам нужно сделать, это использовать:

$pos=strpos($content, ' ', 200);
substr($content,0,$pos ); 
36 голосов
/ 09 июня 2009

Да, есть. Эту функцию я позаимствовал у пользователя на разных форумах несколько лет назад, поэтому я не могу взять ее в кредит.

//truncate a string only at a whitespace (by nogdog)
function truncate($text, $length) {
   $length = abs((int)$length);
   if(strlen($text) > $length) {
      $text = preg_replace("/^(.{1,$length})(\s.*|$)/s", '\\1...', $text);
   }
   return($text);
}

Обратите внимание, что он автоматически добавляет эллипсы, если вы этого не хотите, просто используйте '\\1' в качестве второго параметра для вызова preg_replace.

20 голосов
/ 09 июня 2009

Если вы определяете слова как «последовательности символов, разделенных пробелом» ... Используйте strrpos(), чтобы найти последний пробел в строке, сократить его до этой позиции, обрезать результат.

13 голосов
/ 09 июня 2009

Конечно. Возможно, проще всего написать обертку вокруг preg_match:

function limitString($string, $limit = 100) {
    // Return early if the string is already shorter than the limit
    if(strlen($string) < $limit) {return $string;}

    $regex = "/(.{1,$limit})\b/";
    preg_match($regex, $string, $matches);
    return $matches[1];
}

РЕДАКТИРОВАТЬ: Обновлено, чтобы не ВСЕГДА включать пробел в качестве последнего символа в строке

10 голосов
/ 21 февраля 2012

Эта функция сокращает строку, добавляя "..." на границе слова, когда это возможно. Возвращенная строка будет иметь максимальную длину $len, включая "...".

function truncate($str, $len) {
  $tail = max(0, $len-10);
  $trunk = substr($str, 0, $tail);
  $trunk .= strrev(preg_replace('~^..+?[\s,:]\b|^...~', '...', strrev(substr($str, $tail, $len-$tail))));
  return $trunk;
}

Примеры выходных данных:

  • truncate("Thanks for contributing an answer to Stack Overflow!", 15)
    возвращает "Thanks for..."
  • truncate("To learn more, see our tips on writing great answers.", 15)
    возвращает "To learn more..." (запятая также усечена)
  • truncate("Pseudopseudohypoparathyroidism", 15)
    возвращает "Pseudopseudo..."
9 голосов
/ 26 мая 2016

Это мой подход, основанный на ответе амира, но он не позволяет ни одному слову сделать строку длиннее лимита, используя strrpos () с отрицательным смещением.

Просто, но работает. Я использую тот же синтаксис, что и в вспомогательной функции str_limit () Laravel, на случай, если вы захотите использовать его в не-Laravel проекте.

function str_limit($value, $limit = 100, $end = '...')
{
    $limit = $limit - mb_strlen($end); // Take into account $end string into the limit
    $valuelen = mb_strlen($value);
    return $limit < $valuelen ? mb_substr($value, 0, mb_strrpos($value, ' ', $limit - $valuelen)) . $end : $value;
}
4 голосов
/ 27 октября 2012

Вот отличное решение с точками в конце с полными словами

function text_cut($text, $length = 200, $dots = true) {
    $text = trim(preg_replace('#[\s\n\r\t]{2,}#', ' ', $text));
    $text_temp = $text;
    while (substr($text, $length, 1) != " ") { $length++; if ($length > strlen($text)) { break; } }
    $text = substr($text, 0, $length);
    return $text . ( ( $dots == true && $text != '' && strlen($text_temp) > $length ) ? '...' : ''); 
}

Входной сигнал: Lorem Ipsum Dolor Sit Amet, Concetetur Adipisicing Elit, Sed Do EiusMod Tempor Incididunt U Labore et Dolore Magna Aliqua. Ut enim ad minim veniam, quis nostrud упражнение ullamco labouris nisi ut aliquip ex ea кассовый следствие. Duis aute irure dolor в репереендерит в завитке Velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat непроизведенный, иск в виновном виноватом моллите аниме, то есть лейборист.

Выход: Lorem Ipsum Dolor Sit Amet, Concetetur Adipisicing Elit, Sed Do EiusMod Tempor Incididunt U Labore et Dolore Magna Aliqua. Ut Enim Ad Minim Veniam, Quis Nostrud Упражнения Ullamco Labouris Nisi U Аликвип ...

4 голосов
/ 10 июня 2009

Это прекрасно работает для меня, я использую это в моем сценарии

<?PHP
$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!";
$small = some_function($big);
echo $small;

function some_function($string){
     $string = substr($string,0,100);
     $string = substr($string,0,strrpos($string," "));
     return $string;
}
?>

удачи

3 голосов
/ 02 декабря 2015

Проблема с принятым ответом состоит в том, что строка результата выходит за предел, то есть она может превышать 100 символов, поскольку strpos будет выглядеть как после смещения, и поэтому ваша длина всегда будет превышать ваш предел , Если последнее слово длинное, как squirreled, то длина вашего результата будет 111 (чтобы дать вам представление).

Лучшее решение - использовать функцию wordwrap:

function truncate($str, $length = 125, $append = '...') {
    if (strlen($str) > $length) {
        $delim = "~\n~";
        $str = substr($str, 0, strpos(wordwrap($str, $length, $delim), $delim)) . $append;
    } 

    return $str;
}


echo truncate("The quick brown fox jumped over the lazy dog.", 5);

Таким образом, вы можете быть уверены, что строка обрезана ниже вашего предела (и никогда не переходит)

P.S. Это особенно полезно, если вы планируете хранить усеченную строку в вашей базе данных с фиксированным столбцом типа VARCHAR (50) и т. Д.

P.P.S. Обратите внимание на специальный разделитель в переносе слов. Это сделано для того, чтобы убедиться, что ваша строка правильно обрезана, даже если она содержит символы новой строки (в противном случае она будет обрезана при первой строке, которая вам не нужна).

2 голосов
/ 22 августа 2013

Это сделало это для меня ...

//trim message to 100 characters, regardless of where it cuts off
$msgTrimmed = mb_substr($var,0,100);

//find the index of the last space in the trimmed message
$lastSpace = strrpos($msgTrimmed, ' ', 0);

//now trim the message at the last space so we don't cut it off in the middle of a word
echo mb_substr($msgTrimmed,0,$lastSpace)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...