Intereting Posts
получение значения дополнительной столбцовой таблицы столбцов laravel Nginx – wordpress в подкаталоге, какие данные должны быть переданы? Аутентификация пользователей PHP с помощью сеансов Система регистрации файлов cookie / сеансов нечувствительный к регистру поиск в mongodb для имен пользователей в php Преобразование ASCII и UTF-8 в неспециальные символы с одной функцией Исключение пользовательских данных без магических котировок Как хранить 60 булевых элементов в базе данных MySQL? Как сделать даты синтаксиса strtotime в формате австралийского (т.е. Великобритании): dd / mm / yyyy? Проблема WordPress, вызывающая массивные журналы ошибок Достичь иерархии, Родительского / Детского отношения эффективным и простым способом Программно очистить кеш на symfony 2 Автоматическое выставление счетов в magento Информация о потоке PHP в контроллере pdo_oci make не работает

Текст обрезки до 340 символов

Я вынимаю сообщения в блоге из БД. Я хочу обрезать текст до максимальной длины 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 (), чтобы обрезать строку слов на указанное количество символов, изящно останавливаясь в белых местах. Я думаю, это полезно для вас.

Почему так?

  • Мне нравится решение регулярного выражения над подстрокой , чтобы поймать любые слова, кроме пробелов в слове (интерполяция и т. Д.),
  • Решение Джона Кондо не совсем корректно, так как оно обрезает текст до 340 символов, а затем заканчивает последнее слово (так часто будет длиннее желаемого)

Реальное регулярное решение очень просто:

 /^(.{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 ниже)
  • Если первое слово будет длиннее желаемой максимальной длины, это слово будет жестоко отрезано

  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;