укоротить слово в блоке текста

У меня есть блок текста, который иногда имеет очень длинное слово / веб-адрес, который вырывается из макета моего сайта.

Каков наилучший способ пройти через этот блок текста и сократить слова?

ПРИМЕР:

это какой-то текст, и это длинное слово выглядит так

fkdfjdksodifjdisosdidjsosdifosdfiosdfoisjdfoijsdfoijsdfoijsdfoijsdfoijsdfoisjdfoisdjfoisdfjosdifjosdifjosdifjosdifjosdifjsodifjosdifjosidjfosdifjsdoiofsij and i need that to either wrap in ALL browsers or trim the word. 

Мне нужна функция wordwrap .

Вы можете обрезать строку так, чтобы она отображалась с эллипсисом в середине или в конце строки. Однако это не зависит от фактического рендеринга в веб-браузере. PHP не может определить фактическую длину строки, которая будет иметь определенный шрифт при визуализации в браузере, особенно если вы определили резервные шрифты и не знаете, какой шрифт используется в браузере, например

 font-family: Verdana, Arial, sans-serif; 

Сравните следующее:

Я 23 персонажа длиной
I am 23 characters long

Оба символа имеют одинаковую длину, но поскольку одно монотипировано, а другое – не фактическая ширина, она будет отличаться. PHP не может это определить. Вам нужно будет найти технологию клиентской стороны, возможно, JavaScript , чтобы решить эту проблему для вас.

Вы также можете обернуть текст в элемент с overflow:hidden свойства CSS overflow:hidden чтобы текст исчез после фиксированной длины.

Посмотрите вокруг. Я почти уверен, что об этом спрашивали не раз.

Вы можете использовать свойство word-wrap: break-word CSS, чтобы обернуть текст, который разбивает ваш макет.

Ознакомьтесь с примерами Mozilla Developer Center, которые демонстрируют его использование.

 function fixlongwords($string) { $exploded = explode(' ', $string); $result = ''; foreach($exploded as $curr) { if(strlen($curr) > 20) { $curr = wordwrap($curr, 20, '<br/>\n'); } $result .= $curr.' '; } return $result; } 

Это должно выполнить эту работу.

Вы могли бы сделать что-то вроде этого:

 preg_replace("/(\\S{20})/", '$1&zwnj;', $text); 

Он должен * добавить символ non-join с нулевой шириной во все слова каждые 20 символов. Это означает, что они будут переносить слова.

* (непроверенный)

Основываясь на ответе @ JonnyLitt, вот мой вопрос:

 <?php function insertSoftBreak($string, $interval=20, $breakChr='&shy;') { $splitString = explode(' ', $string); foreach($splitString as $key => $val) { if(strlen($val)>$interval) { $splitString[$key] = wordwrap($val, $interval, $breakChr, true); } } return implode(' ', $splitString); } $string = 'Hello, My name is fwwfdfhhhfhhhfrhgrhffwfweronwefbwuecfbryhfbqpibcqpbfefpibcyhpihbasdcbiasdfayifvbpbfawfgawg, because that is my name.'; echo insertSoftBreak($string); ?> 

Разбивая строку в пространственно разделенных значениях, проверяйте длину каждого отдельного слова (слова включают символы, такие как точка, запятая или знак вопроса). Для каждого слова проверьте, длина длиннее, чем $interval символов, и если да, добавьте &shy; (мягкий дефис) каждый $interval -ный символ.

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

Я не знаю никаких других пригодных для использования (и хорошо поддерживаемых) HTML-объектов, которые могли бы использоваться вместо этого ( &zwnj; похоже, не работает в FF 3.6, по крайней мере), поэтому, если поддержка crossbrowser для &shy; оказывается, не хватает, лучше всего использовать CSS или Javascript.