сократить слово в блоке текста - PullRequest
0 голосов
/ 15 марта 2010

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

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

Пример:

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

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

Ответы [ 6 ]

1 голос
/ 15 марта 2010

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

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

1 голос
/ 15 марта 2010
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;

}

Это должно сделать работу.

1 голос
/ 15 марта 2010

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

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

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

Я длиной 23 символа
I am 23 characters long

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

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

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

1 голос
/ 15 марта 2010

Вам нужна wordwrap функция, я полагаю.

0 голосов
/ 15 марта 2010

Основываясь на ответе @ 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, по крайней мере), поэтому, если поддержка кросс-браузера для &shy; превратится без этого лучше всего использовать чистое решение на основе CSS или Javascript.

0 голосов
/ 15 марта 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...