Я вынимаю сообщения в блоге из БД. Я хочу обрезать текст до максимальной длины 340 символов.
Если в блоге более 340 символов, я хочу обрезать текст до последнего полного слова и добавить «…» в конец.
Eg NOT: In the begin.... BUT: In the ...
Другие ответы показывают, как вы можете сделать текст примерно 340 символов. Если это хорошо для вас, используйте один из других ответов.
Но если вам нужен очень строгий максимум 340 символов, другие ответы не будут работать. Вы должны помнить, что добавление '...'
может увеличить длину строки, и вам нужно учесть это.
$max_length = 340; if (strlen($s) > $max_length) { $offset = ($max_length - 3) - strlen($s); $s = substr($s, 0, strrpos($s, ' ', $offset)) . '...'; }
Также обратите внимание, что здесь я использую перегрузку strrpos
которая принимает смещение, чтобы начать поиск непосредственно из правильного местоположения в строке, а не сначала сокращать строку.
Смотрите, как работает онлайн: ideone
Похоже, вы хотели бы сначала обрезать текст до 340 символов, а затем найти место последнего «в строке» и обрезать до этой суммы. Как это:
$string = substr($string, 0, 340); $string = substr($string, 0, strrpos($string, ' ')) . " ...";
Если у вас включено расширение mbstring (которое сейчас находится на большинстве серверов), вы можете использовать функцию mb_strimwidth.
echo mb_strimwidth($string, 0, 340, '...');
пытаться:
preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches); echo $matches[0] . '...';
Я поставил ответ Джона Конде в методе:
function softTrim($text, $count, $wrapText='...'){ if(strlen($text)>$count){ preg_match('/^.{0,' . $count . '}(?:.*?)\b/siu', $text, $matches); $text = $matches[0]; }else{ $wrapText = ''; } return $text . $wrapText; }
Примеры:
echo softTrim("Lorem Ipsum is simply dummy text", 10); /* Output: Lorem Ipsum... */ echo softTrim("Lorem Ipsum is simply dummy text", 33); /* Output: Lorem Ipsum is simply dummy text */ echo softTrim("LoremIpsumissimplydummytext", 10); /* Output: LoremIpsumissimplydummytext... */
вы можете попробовать использовать функции, которые поставляются с PHP, например wordwrap
print wordwrap($text,340) . "...";
функция trim_characters ($ text, $ length = 340) {
$length = (int) $length; $text = trim( strip_tags( $text ) ); if ( strlen( $text ) > $length ) { $text = substr( $text, 0, $length + 1 ); $words = preg_split( "/[\s]| /", $text, -1, PREG_SPLIT_NO_EMPTY ); preg_match( "/[\s]| /", $text, $lastchar, 0, $length ); if ( empty( $lastchar ) ) array_pop( $words ); $text = implode( ' ', $words ); } return $text;
}
Используйте эту функцию trim_characters (), чтобы обрезать строку слов на указанное количество символов, изящно останавливаясь в белых местах. Я думаю, это полезно для вас.
Почему так?
Реальное регулярное решение очень просто:
/^(.{0,339}\w\b)/su
Полный метод в PHP может выглядеть следующим образом:
function trim_length($text, $maxLength, $trimIndicator = '...') { if(strlen($text) > $maxLength) { $shownLength = $maxLength - strlen($trimIndicator); if ($shownLength < 1) { throw new \InvalidArgumentException('Second argument for ' . __METHOD__ . '() is too small.'); } preg_match('/^(.{0,' . ($shownLength - 1) . '}\w\b)/su', $text, $matches); return (isset($matches[1]) ? $matches[1] : substr($text, 0, $shownLength)) . $trimIndicator ; } return $text; }
Больше объяснений:
$shownLength
должен содержать очень строгий предел (как упоминал Марк Байерс) \w\b
состоит в том, чтобы избежать пробела или интерполяции в конце (см. 1 ниже) In the ...
описывается как желаемый, я чувствую In the...
более гладкий (тоже не нравится In the,...
и т. Д.), Простейшее решение
$text_to_be_trim= "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard."; if(strlen($text_to_be_trim) > 20) $text_to_be_trim= substr($text_to_be_trim,0,20).'....';
Для многобайтового текста
$stringText= "UTIL CONTROL DISTRIBUCION AMARRE CIGÜEÑAL"; $string_encoding = 'utf8'; $s_trunc = mb_substr($stringText, 0, 37, $string_encoding); echo $s_trunc;