Intereting Posts
Использование единой «умной цитаты» в моих данных JSON – это нарушение PHP-скрипта Как распечатать список с использованием иерархической структуры данных? Использование переменных статического класса – в heredoc Работа с флажком из массива формы в php Добавление массивов в многомерный массив внутри цикла MVC – учебник класса контроллера Хорошая идея / плохая идея? Использование MySQL RAND () вне небольшого набора результатов подзапроса? Кнопка Safari Back не выполняет сеанс выхода из PHP PHP Javascript? Сделайте что-то, когда пользователь закрывает страницу или браузер Использовать utf8 или нет – проблема с кодировкой символов MySQL и PHP php lib для разбора html в дереве иерархии DOM Борьба за установку названий страниц для динамических страниц PHP на сайте WordPress Как отправить данные формата FLV в byteArray с помощью URLloader в php-скрипт? Как проверить статус учетной записи PayPal по электронной почте или мобильному телефону, используя php api? Загрузка файла jQuery с дополнительными данными

Как укоротить строку, не нарезая слова, сохраняя в пределах лимита символов в PHP

Возможный дубликат:
Как усечь строку в 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); } 

Solutions Collecting From Web of "Как укоротить строку, не нарезая слова, сохраняя в пределах лимита символов в PHP"

Если строка слишком длинная, вы можете сначала использовать 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; }