Как укоротить строку, не режущий через слово при оставлении в рамках символьного предела в PHP [дубликат]

5
задан Community 23 May 2017 в 12:15
поделиться

9 ответов

Если строка слишком длинная, вы можете сначала использовать substr, чтобы обрезать строку, а затем регулярное выражение, чтобы удалить последнее полное или частичное слово:

$s = substr($s, 0, (140 - 3));
$s = preg_replace('/ [^ ]*$/', ' ...', $s);

Обратите внимание, что вы должны сделать оригинал короче 140 байт, потому что когда вы добавляете ... это может увеличить длину строки до более 140 байт.

7
ответ дан 13 December 2019 в 05:34
поделиться

Это функция, которую Drupal использует для сокращения строк без разбивки слов.

//$wordsafe: set to TRUE to not truncate in middle of words
//$dots: set to TRUE to add " ..." to the end of the truncated string
function truncate_utf8($string, $len, $wordsafe = FALSE, $dots = FALSE) {

  if (strlen($string) <= $len) {
    return $string;
  }

  if ($dots) {
    $len -= 4;
  }

  if ($wordsafe) {
    $string = substr($string, 0, $len + 1); // leave one more character
    if ($last_space = strrpos($string, ' ')) { // space exists AND is not on position 0
      $string = substr($string, 0, $last_space);
    }
    else {
      $string = substr($string, 0, $len);
    }
  }
  else {
    $string = substr($string, 0, $len);
  }

  if ($dots) {
    $string .= ' ...';
  }

  return $string;
}
3
ответ дан 13 December 2019 в 05:34
поделиться

Вы можете посмотреть strtok в руководстве по php.

Что вы можете сделать, так это запустить цикл и каждый раз добавлять strlen токена, пока вы не превысите желаемую длину.

0
ответ дан 13 December 2019 в 05:34
поделиться
0
ответ дан 13 December 2019 в 05:34
поделиться
//beak into 140 character chunks
$strParts = str_split( $str, 140 );

//if the first character of the second chunk is not whitespace
if( isset( $strParts[1] ) && !preg_match( '/^\s/', $strParts[1] ) {
    //strip off the last partial word from the first chunk
    $strParts[0] = preg_replace( '/\s\w+$/', '', $strParts[0] );
}

//you're done
$str = $strParts[0];
0
ответ дан 13 December 2019 в 05:34
поделиться

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

function truncate($text, $length) {
    $length = abs((int)$length);

    $count = preg_match_all("(\s+)", $text, $matches, PREG_OFFSET_CAPTURE);

    while ($count > 0) {
       if ($matches[$count][0] <= $length) {
          $length = $matches[$count][0];
          break;
       }    
       $count = $count - 1;
    }

    return substr($text, 0, $length)
}
0
ответ дан 13 December 2019 в 05:34
поделиться

Вы можете использовать strrpos для поиска последнего символа пробела в строке:

function truncate($text, $length = 140) {
    if(strlen($text) > $length) {
        // $length - strlen($text) is used to find the last occurrence of a blank
        // UP TO the $length character in the string.
        $text = substr($text, 0, strrpos($text,' ', $length - strlen($text) ));
    }
    return $text;
}

Это не добавит ... . Чтобы это работало, вы можете изменить функцию на:

function truncate($text, $length = 140) {
    if(strlen($text) > $length) {
        $text = substr($text, 0, strrpos($text,' ', $length - strlen($text)-3)) . '...';
    }
    return $text;
}
0
ответ дан 13 December 2019 в 05:34
поделиться

Я не очень хорошо знаю php, но вот как это можно сделать с помощью приблизительного синтаксиса

$total_length = 0;

$words = $whole_sentense->split(' ')

$word_index = 0

$final_sentense = ''

while($total_length + strlen($words[$word_index]) < 140)
{
  $final_sentense .= words[$word_index]
  $total_length += strlen($words[$word_index]
  $word_index++
}

return ($final_sentense)
0
ответ дан 13 December 2019 в 05:34
поделиться

Также в строках вряд ли будут табуляции, \t, так что вы можете сделать это

$str = word_wrap( $str, 140, "\t" );
$str = explode( "\t", $str );
$str = $str[0];
2
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: