Intereting Posts
Laravel5 Перенаправить на внешний URL с параметрами Значения форм пусты (не значение) после визуализации виджета в форме Возможно ли, используя PHPUnit mock objects, ожидать вызова магического метода __call ()? php return или reference? как установить новый охранник для контроллера auth в laravel PHP Выберите каждую среду Торговая площадка Braintree – Что произойдет, если Master Merchant взимает плату с клиента во время продажи, но должен заплатить доспелому PHP-сессии * не всегда * работают Непоследовательная сериализация сеанса на серверах Передача по ссылке третьего параметра в PHP array_walk без предупреждения Каков наилучший способ создания whois-поиска? Laravel Создание таблицы базы данных userInfo при регистрации пользователей ftp_ssl_connect с неявным ftp над tls функции для получения / установки значений в многомерных массивах динамически я могу передать запрос mongodb как строку в php

Умный перенос слов в PHP для длинных слов?

Я ищу способ сделать Word-wrap в PHP немного умнее. Таким образом, он не прерывает длинные слова, оставляя на одной строке любые предыдущие небольшие слова.

Предположим, у меня это (реальный текст всегда полностью динамический, это просто показать):

wordwrap('hello! heeeeeeeeeeeeeeereisaverylongword', 25, '<br />', true); 

Эти результаты:

Здравствуйте!
heeeeeeeeeeeeeeereisavery
длинное слово

Понимаете, он оставляет только небольшое слово в первой строке. Как я могу заставить это сделать что-то более похожее на это:

Здравствуйте! heeeeeeeeeeee
eeereisaverylongword

Таким образом, он использует любое доступное пространство в каждой строке. Я пробовал несколько пользовательских функций, но ни один из них не был эффективным (или у них были некоторые недостатки).

    У меня есть функция пользовательской функции для этого умного словаря:

     function smart_wordwrap($string, $width = 75, $break = "\n") { // split on problem words over the line length $pattern = sprintf('/([^ ]{%d,})/', $width); $output = ''; $words = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); foreach ($words as $word) { if (false !== strpos($word, ' ')) { // normal behaviour, rebuild the string $output .= $word; } else { // work out how many characters would be on the current line $wrapped = explode($break, wordwrap($output, $width, $break)); $count = $width - (strlen(end($wrapped)) % $width); // fill the current line and add a break $output .= substr($word, 0, $count) . $break; // wrap any remaining characters from the problem word $output .= wordwrap(substr($word, $count), $width, $break, true); } } // wrap the final output return wordwrap($output, $width, $break); } $string = 'hello! too long here too long here too heeeeeeeeeeeeeereisaverylongword but these words are shorterrrrrrrrrrrrrrrrrrrr'; echo smart_wordwrap($string, 11) . "\n"; 

    РЕДАКТИРОВАТЬ : Пятнистый пара предупреждений. Одно из основных предостережений с этим (а также с нативной функцией) – отсутствие поддержки многобайтов.

    Как насчет

     $string = "hello! heeeeeeeeeeeeeeereisaverylongword"; $break = 25; echo implode(PHP_EOL, str_split($string, $break)); 

    Какие результаты

     hello! heeeeeeeeeeeeeeere isaverylongword 

    str_split () преобразует строку в массив блоков размером $ break.

    implode () присоединяет массив назад вместе как строку, используя клей, который в этом случае является маркером конца строки (PHP_EOL), хотя он также может быть « <br/> »

    Это также решение (для браузеров и т. Д.):

     $string = 'hello! heeeeeeeeeeeeeeeeeeeeeereisaverylongword'; echo preg_replace('/([^\s]{20})(?=[^\s])/', '$1'.'<wbr>', $string); 

    Он помещает <wbr> в слова с 20 или более символами

    <wbr> означает «возможность прерывания слова», поэтому он только ломается, если он должен (продиктован шириной элемента / браузера / зрителя / другого). Это невидимо иначе.

    Хорошо подходит для жидкостной / отзывчивой компоновки, где нет фиксированной ширины. И не обертывает нечетное, как слово wordprap php

    Вы можете использовать CSS для этого.

     word-wrap: break-word; 

    Это сломает вам слово. Вот ссылка, чтобы увидеть его в действии:

    http://www.css3.info/preview/word-wrap/

    Это должно сделать трюк …

     $word = "hello!" . wordwrap('heeeeeeeeeeeeeeereisaverylongword', 25, '<br />', true); echo $word;