У меня есть блок текста, который иногда имеет очень длинное слово / веб-адрес, который вырывается из макета моего сайта.
Каков наилучший способ пройти через этот блок текста и сократить слова?
ПРИМЕР:
это какой-то текст, и это длинное слово выглядит так
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‌', $text);
Он должен * добавить символ non-join с нулевой шириной во все слова каждые 20 символов. Это означает, что они будут переносить слова.
*
(непроверенный)
Основываясь на ответе @ JonnyLitt, вот мой вопрос:
<?php function insertSoftBreak($string, $interval=20, $breakChr='­') { $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
символов, и если да, добавьте ­
(мягкий дефис) каждый $interval
-ный символ.
Я выбрал мягкие дефисы, потому что они, похоже, относительно хорошо поддерживаются в браузерах, и они обычно не показывают, если слово фактически не обертывается в этой позиции.
Я не знаю никаких других пригодных для использования (и хорошо поддерживаемых) HTML-объектов, которые могли бы использоваться вместо этого ( ‌
похоже, не работает в FF 3.6, по крайней мере), поэтому, если поддержка crossbrowser для ­
оказывается, не хватает, лучше всего использовать CSS или Javascript.