Обрезать текст до 340 символов - PullRequest
12 голосов
/ 20 января 2010

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

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

E.g.

NOT: In the begin....

BUT: In the ...

Ответы [ 9 ]

26 голосов
/ 20 января 2010

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

$string = substr($string, 0, 340);
$string = substr($string, 0, strrpos($string, ' ')) . " ...";
16 голосов
/ 07 июня 2014

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

echo mb_strimwidth($string, 0, 340, '...');
14 голосов
/ 20 января 2010

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

7 голосов
/ 20 января 2010

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

preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches);
echo $matches[0] . '...';
2 голосов
/ 15 февраля 2013

Я положил ответ Джона Конде в методе:

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... */
0 голосов
/ 23 мая 2017

Самое простое решение

$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 голосов
/ 05 февраля 2016

Почему так?

  • Мне нравится решение regex над подстрокой , чтобы перехватывать все, кроме пробелов в словах (взаимодействие и т. Д.)
  • Решение Джона Кондо не совсем корректно, так как оно обрезает текст до 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,... и т. Д.)
0 голосов
/ 01 ноября 2012

функция 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]|&nbsp;/", $text, -1, PREG_SPLIT_NO_EMPTY );
    preg_match( "/[\s]|&nbsp;/", $text, $lastchar, 0, $length );
    if ( empty( $lastchar ) )
        array_pop( $words );

    $text = implode( ' ', $words ); 
}

return $text;

}

Используйте эту функцию trim_characters (), чтобы обрезать строку слов до указанного количества символов, изящно останавливаясь на пробелах. Я думаю, что это полезно для вас.

0 голосов
/ 21 января 2010

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

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