Вот вопрос: как бы вы обрезали блок текста до ближайшего слова, когда прошло определенное количество символов. Я не пытаюсь ограничить определенное количество слов или букв, но ограничиваю буквы и сокращаю их на ближайшем слове.
Скажем, у меня было две строки:
"This is a block of text, blah blah blah" "this is another block of txt 2 work with"
Скажем, я хотел ограничить его до 27 символов, первая строка закончилась бы «бла», а вторая – заканчивалась на «txt», даже если в этих словах были достигнуты ограничения персонажа.
Есть ли какое-либо чистое решение этой проблемы?
См. Функцию 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]. '...'; }