2010-01-20 1 views
8

Я вынимаю сообщения в блоге из БД. Я хочу обрезать текст до максимальной длины 340 символов.Текст обрезки до 340 символов

Если сообщение в блоге превышает 340 символов, я хочу обрезать текст до последнего полного слова и добавить «...» в конец.

E.g. 

NOT: In the begin.... 

BUT: In the ... 
+4

Что вы хотите сделать если пользователь вводит одно слово длиной 341 символ (без пробелов вообще в сообщении)? –

ответ

11

Другие ответы показать вам, как вы можете сделать текст примерно 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

+0

не будет делать '$. = '...'' проще, чем на последнем шаге? – silkAdmin

+1

@silkAdmin: Спасибо за ваш комментарий. Я сделал некоторые улучшения в своем ответе. –

+0

Прохладный, довольно старый поток, но я уверен, что он по-прежнему будет полезен для большого количества людей! – silkAdmin

7

попробовать:

preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches); 
echo $matches[0] . '...'; 
+4

По умолчанию '.' не соответствует разрыву строки. Поэтому, когда есть разрывы строк до 340-го символа, это не сработает. Добавление модификатора '' 'в конце будет делать трюк. –

26

Похоже, что вы хотите, чтобы первый обрезать текст до 340 символов точно, то найти место последнего «» в строке и подрезать вниз к тому, что количество. Как это:

$string = substr($string, 0, 340); 
$string = substr($string, 0, strrpos($string, ' ')) . " ..."; 
+0

Нужно немного польский (проверьте, нужно ли сокращать строку и т. Д.), Но короткий и сладкий. – adamJLev

0

вы можете попробовать использовать функции, которая поставляется с PHP, такие как WordWrap

print wordwrap($text,340) . "..."; 
0

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

2

я поставил ответ Джон Конды в методе:

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... */ 
13

Если у вас есть MBstring расширение включены (что на большинстве серверов в наше время), вы можете использовать функция mb_strimwidth.

echo mb_strimwidth($string, 0, 340, '...'); 
+0

Все приветствуют один лайнер! Очень приятно поймать :) – Gruber

+0

Довольно удивлен, почему это не выше всех. Элегантное решение. – pihyper

0

Зачем этот путь?

  • Мне нравится регулярное выражение решение по подстроку, чтобы поймать любой, кроме пробельных разрывов слов (interpunction и т.д.) Раствор
  • Джона Condoe не является абсолютно правильным, так как обрезать текст до 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 часть, чтобы избежать пробелов или interpunction на конец (см 1 ниже)
  • В случае, если первое слово будет длиннее желаемой максимальной длиной, что слово будет грубо вырезать

  1. Несмотря на то, что в вопросе привести In the ... описывается по желанию, я чувствую In the... более гладкой (тоже не люблю In the,... и т.д.)
0

Простейшее решение

$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; 
+0

Это может потерпеть неудачу, когда вы встретите специальный символ. Просто случилось со мной. Если вы отрубитесь прямо там, это терпит неудачу. Если вы идете на один персонаж дальше, он работает. Итак, Марк Байерс отвечает мне. Работает отлично. – mayid

+0

Не могли бы вы поделиться текстом, который нужно подрезать? Так что я могу проверить свое решение. –

+0

Конечно. Попробуйте это и залейте в Ü: «ДИСТРИБЬЮЦИЯ UTIL CONTROL AMARRE CIGÜEÑAL». Письмо 40 для меня. – mayid