Если строка слишком длинная, вы можете сначала использовать substr, чтобы обрезать строку, а затем регулярное выражение, чтобы удалить последнее полное или частичное слово:
$s = substr($s, 0, (140 - 3));
$s = preg_replace('/ [^ ]*$/', ' ...', $s);
Обратите внимание, что вы должны сделать оригинал короче 140 байт, потому что когда вы добавляете ... это может увеличить длину строки до более 140 байт.
Это функция, которую 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;
}
Вы можете посмотреть strtok в руководстве по php.
Что вы можете сделать, так это запустить цикл и каждый раз добавлять strlen токена, пока вы не превысите желаемую длину.
Нашел решение в предыдущем вопросе, указанном @Jordan: Как усечь строку в PHP до слова, ближайшего к определенному количеству символов?
//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];
Как насчет использования регулярного выражения для поиска всех пробельных символов, а затем усечения на том совпадении, которое является наибольшим, но все еще меньше или равно желаемой длине.
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)
}
Вы можете использовать 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;
}
Я не очень хорошо знаю 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)
Также в строках вряд ли будут табуляции, \t, так что вы можете сделать это
$str = word_wrap( $str, 140, "\t" );
$str = explode( "\t", $str );
$str = $str[0];