У меня есть 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 atest.Hello,Stackoverflow! Thisought totrigger acouple ofbreaks.
такими вещами, как: This is atest.Hello,Stackoverflow! Thisought totrigger acouple ofbreaks.
This is atest.Hello,Stackoverflow! Thisought totrigger acouple ofbreaks.
Я также закодировал небольшой синтаксический анализатор 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, "­", true); } $text = implode(' ',$array); } echo $text;
В этом примере слова с длиной больше 10, тогда слово, завернутое в & shy; характер, который очень полезен, поскольку он создает мягкий дефис на разрывах. Замените его своим нарушителем, если вы не получите дополнительных дефисов. Вы также можете попробовать обернуть слово с меньшим номером, чем максимальная длина перед взломом, IE strlen> 20, перенос слов в 10
Это работает для меня:
<? ini_set("display_errors", TRUE); error_reporting(-1 ^ E_NOTICE); header("Content-Type: text/html; charset=utf-8"); $line = "This is a test. Hello, Stackoverflow! 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>