Возможный дубликат:
Как усечь строку в PHP до слова, ближайшего к определенному числу символов?
Как я могу сократить строку до 140 символов без перерезания слова.
Возьмите следующую строку:
$string = "This is an example string that contains more than 140 characters. If I use PHPs substring function it will split it in the middle of this word."
Используя substr($string, 0, 140)
мы получим что-то вроде этого:
This is an example string that contains more than 140 characters. If I use PHPs substring function it will split it in the middle of this wo
Обратите внимание, что это нарезано словом «слово».
Мне нужно уметь сокращать строку, сохраняя целые слова, но не имея более 140 символов.
Я нашел следующий код, но даже если он сохранит целые слова, он не гарантирует, что вся строка не будет превышать ограничение 140 символов:
function truncate($text, $length) { $length = abs((int)$length); if(strlen($text) > $length) { $text = preg_replace("/^(.{1,$length})(\s.*|$)/s", '\\1...', $text); } return($text); }
Если строка слишком длинная, вы можете сначала использовать 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; }
Кроме того, строки вряд ли будут иметь вкладки, \ t, в них, чтобы вы могли сделать это
$str = word_wrap( $str, 140, "\t" ); $str = explode( "\t", $str ); $str = $str[0];
Я не знаю 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)
Вы можете посмотреть на strtok в руководстве по php.
То, что вы можете сделать, это запустить цикл и каждый раз добавить маркер токена, пока вы не превысите желаемую длину.
Нашел решение в предыдущем вопросе, как указано в @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; }