Обрезка блока текста до ближайшего слова, когда достигается определенный предел символов?

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

Скажем, у меня было две строки:

"This is a block of text, blah blah blah" "this is another block of txt 2 work with" 

Скажем, я хотел ограничить его до 27 символов, первая строка закончилась бы «бла», а вторая – заканчивалась на «txt», даже если в этих словах были достигнуты ограничения персонажа.

Есть ли какое-либо чистое решение этой проблемы?

Related of "Обрезка блока текста до ближайшего слова, когда достигается определенный предел символов?"

См. Функцию wordwrap .

Я бы, наверное, сделал что-то вроде:

 function wrap($string) { $wstring = explode("\n", wordwrap($string, 27, "\n") ); return $wstring[0]; } 

(Если ваши строки уже охватывают суровые линии, используйте другой символ или шаблон – для разделения, отличного от «\ n»)

Я написал функцию max-string-length, которая делает только это и очень чиста.

Не проще ли было бы упростить строки, используя держатель места (т. Е.: ### PLACEHOLDER ###), подсчитать символы строки за вычетом вашего владельца места, обрезать его до нужной длины с помощью substr, а затем взорвать заполнитель ?

Я думаю, что это должно сделать трюк:

 function trimToWord($string, $length, $delimiter = '...') { $string = str_replace("\n","",$string); $string = str_replace("\r","",$string); $string = strip_tags($string); $currentLength = strlen($string); if($currentLength > $length) { preg_match('/(.{' . $length . '}.*?)\b/', $string, $matches); return rtrim($matches[1]) . $delimiter; } else { return $string; } } 

Вы можете использовать малоизвестный модификатор для str_word_count, чтобы помочь в этом. Если вы передадите параметр «2», он возвращает массив, в котором находится позиция слова.

Ниже приведен простой способ использования этого, но можно было бы сделать это более эффективно:

 $str = 'This is a string with a few words in'; $limit = 20; $ending = $limit; $words = str_word_count($str, 2); foreach($words as $pos=>$word) { if($pos+strlen($word)<$limit) { $ending=$pos+strlen($word); } else{ break; } } echo substr($str, 0, $ending); // outputs 'this is a string' 
 // Trim very long text to 120 characters. Add an ellipsis if the text is trimmed. if(strlen($very_long_text) > 120) { $matches = array(); preg_match("/^(.{1,120})[\s]/i", $very_long_text, $matches); $trimmed_text = $matches[0]. '...'; }