Как использовать wordwrap или иначе, чтобы разбить текст, чтобы он соответствовал ширине div

У меня есть div, который имеет ширину жидкости, поэтому я не могу предсказать его размер в PHP. Если кто-то вводит длинную строку, которая не ограничена пробелами в любом месте, браузер будет растягивать страницу, и это становится довольно раздражающим довольно быстро. Я попытался использовать функцию wordwrap для этого, но я никогда не могу найти правильную ширину, и у меня возникают проблемы с выходом.

Вот что я пытаюсь, основываясь на комментарии, оставленные на странице документации для wordwrap :

 <?php //Using ​ here allows the browser to break the line of text, without the visual distraction. $line = wordwrap($line, 10, "​", true); ?> 

Далее в комментарии объясняется, как это символ пространства с нулевой шириной , который будет показывать браузеру, что он может сломаться, но не отображается.

Я уверен, что вы уже видите две проблемы, которые возникли. Он также заменит обычные пространства этим пространством нулевой ширины, поэтому я This is a​test.​Hello,​Stackoverf​low! This​ought to​trigger a​couple of​breaks. такими вещами, как: This is a​test.​Hello,​Stackoverf​low! This​ought to​trigger a​couple of​breaks. This is a​test.​Hello,​Stackoverf​low! This​ought to​trigger a​couple of​breaks.

Я также закодировал небольшой синтаксический анализатор bbcode для этого, и он также разбивает мой вывод html, поскольку он разрезает теги.

С положительной стороны, невероятно длинные слова сломаны, как ожидалось!

Я попытался установить различные свойства переполнения в div в CSS, но ни один из них не функционирует должным образом.

Существует свойство CSS:

 word-wrap: break-word; 

В противном случае, если вы хотите сохранить этот PHP, Idealy, вы только хотите применить разрыв слов с количеством символов больше X. Это разделит строку на пробел и применит проверку для каждого слова. У вас могут возникнуть проблемы со ссылками, но вы можете легко проверить наличие URL-адресов или применить регулярное выражение.

 $text = 'this text is fine but waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay long stuff gets broken waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay up into bits'; if($array = explode(' ',$text) and is_array($array)) { foreach($array as $key => $value) { if(strlen($value) > 10) $array[$key] = wordwrap($value, 10, "&shy;", true); } $text = implode(' ',$array); } echo $text; 

В этом примере слова с длиной больше 10, тогда слово, завернутое в & shy; характер, который очень полезен, поскольку он создает мягкий дефис на разрывах. Замените его своим нарушителем, если вы не получите дополнительных дефисов. Вы также можете попробовать обернуть слово с меньшим номером, чем максимальная длина перед взломом, IE strlen> 20, перенос слов в 10

Пример: http://img.ruphp.com/php/fKINR.png

Это работает для меня:

  <? ini_set("display_errors", TRUE); error_reporting(-1 ^ E_NOTICE); header("Content-Type: text/html; charset=utf-8"); $line = "This is a​ test.​ Hello,​ Stackoverf​low! This​ ought to​ trigger a ​couple of​ breaks"; $line = wordwrap($line, 10, "\n", true); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de"> <head> <title>Linebreak Test</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <div style="white-space: pre"><?=$line?></div> </body> </html>