Как обернуть длинные строки без пробелов в HTML?

Если пользователь вводит длинную строку без пробелов или пробелов, форматирование прерывается, поскольку он выходит за пределы текущего элемента. Что-то типа:

HAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHA.............................................................................................................................................

Я пробовал просто использовать wordwrap() в PHP, но проблема в том, что если есть ссылка или другой действительный HTML, он ломается.

Кажется, что в CSS есть несколько вариантов, но ни один из них не работает во всех браузерах. См. Перенос слов в IE.

Как решить эту проблему?

Этот вопрос только что разбил Chrome - и ВСЕ его вкладки. Самый первый раз. Почему первая строка не переносится ?!

TheSoftwareJedi 12.12.2008 20:11

@TheSoftwareJedi - учитывая, что Chrome должен обрабатывать вкладки независимо, включая сбои, вы можете подумать о том, чтобы сообщить об этом команде Google как об ошибке.

Corey Ballou 11.01.2010 16:28

+1 за вызов сотрудников ТАК. Похоже, они это исправили. :)

Tyler Crompton 09.11.2011 13:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
69
3
82 195
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Я избегаю проблемы, не фиксируя правую боковую панель следующим образом: P

Я бы поместил сообщение в div, у которого было бы переполнение фиксированной ширины для прокрутки (или для полного скрытия в зависимости от содержимого).

так нравится:

#post{
    width: 500px;
    overflow: scroll;
}

Но это только я.

Обновлено: Как указывает cLFlaVA ... лучше использовать auto, чем scroll. Я согласен с ним.

Вот что я делаю в ASP.NET:

  1. Разделите текстовое поле на пробелы, чтобы получить все слова
  2. Перебирайте слова в поисках слов, длина которых превышает определенное количество
  3. Вставьте каждые x символов (например, каждые 25 символов).

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

Мне нравится использовать сочетание свойств / значений CSS overflow: auto. Это отобразит родительский объект так, как вы ожидаете. Если текст в родительском элементе слишком широкий, полосы прокрутки появляются внутри самого объекта. Это сохранит структуру так, как вы хотите, и предоставит зрителю возможность прокручивать, чтобы увидеть больше.

Обновлено: преимущество overflow: auto по сравнению с overflow: scroll заключается в том, что с auto полосы прокрутки будут появляться только при наличии переполненного содержимого. В scroll полосы прокрутки всегда видны.

Дополнительным преимуществом использования overflow: auto является то, что он устраняет проблемы очистки IE6, если у вас есть вложенные числа с плавающей запятой.

Corey Ballou 11.01.2010 16:27

Не существует «идеального» решения HTML / CSS.

Решения либо скрывают переполнение (т.е. прокручиваются, либо просто скрываются), либо расширяются, чтобы соответствовать. Нет никакой магии.

В: Как поместить объект шириной 100 см в пространство шириной всего 99 см?

A: Вы не можете.

Вы можете прочитать слово-слово

РЕДАКТИРОВАТЬ

Пожалуйста, ознакомьтесь с этим решением Как применить стиль переноса / продолжения строки и форматирование кода с помощью css

или же

Как не допустить, чтобы длинные слова ломали мой div?

Я понимаю, но пользователи иногда делают это, поэтому должно быть какое-то решение, чтобы справиться с этим, чтобы макет не ломался. word-wrap работает только в IE.

Chris Bartow 12.12.2008 20:25
Ответ принят как подходящий

Я лично не использовал его, но Переносчик выглядит многообещающим.

Также см. Связанные (возможно, повторяющиеся) вопросы:

на основе предложения Джона созданный мной код:

public static string WrapWords(string text, int maxLength)
    {
        string[] words = text.Split(' ');
        for (int i = 0; i < words.Length; i++)
        {
            if (words[i].Length > maxLength) //long word
            {
                words[i] = words[i].Insert(maxLength, " ");
                //still long ?
                words[i]=WrapWords(words[i], maxLength);
            }
        }
        text = string.Join(" ", words);
        return (text);
    }

C# (любимый StackOverflow)

Guillaume Massé 15.11.2011 08:06

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

Переносить длинные строки с помощью CSS и JavaScript

в CSS3:

word-wrap:break-word

Этот мне подходит. И, кажется, хорошо поддерживается Chrome / IE.

Thomas 30.10.2010 02:17

Это прекрасно работает. Вам нужно убедиться, что ширина установлена ​​или привязана.

ekerner 20.04.2011 17:47

Несмотря на широкую поддержку переноса слов, это свойство, по-видимому, было заменено на «overflow-wrap» в последней версии спецификации CSS3: amazingwebs.com/new-css3-text-wrap overflow-wrap, похоже, пока не поддерживается ни одним из основных браузеров, однако, тогда как перенос слов есть.

Jon Schneider 07.03.2012 19:54

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

Дополнительную информацию см. В следующем примере кода ;-)

<?php
    $v = "reallyreallyreallylonglinkreallyreallyreallylonglinkreallyreallyreallylonglinkreallyreallyreallylonglinkreallyreallyreallylonglinkreallyreallyreallylonglink";
    $v2 = wordwrap($v, 12, "<br/>", true);
?>
<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <table width = "300" border = "1">
            <tr height = "30">
                <td colspan = "3" align = "center" valign = "top">test</td>
            </tr>
            <tr>
                <td width = "100"><a href = "<?php echo $v; ?>"><?php echo $v2; ?></a></td>
                <td width = "100">&nbsp;</td>
                <td width = "100">&nbsp;</td>
            </tr>
        </table>
    </body>
</html>

Надеюсь это поможет.

Я не тот, кто проголосовал против, но вы читали вопрос? Оператор сказал, что ему не повезло. И, пожалуйста, отойдите от table (каламбур).

Tyler Crompton 09.11.2011 13:30

Я пытался решить ту же проблему и нашел решение здесь:

http://perishablepress.com/press/2010/06/01/wrapping-content/

Решение: добавление в контейнер следующих свойств CSS

div {
    white-space: pre;           /* CSS 2.0 */
    white-space: pre-wrap;      /* CSS 2.1 */
    white-space: pre-line;      /* CSS 3.0 */
    white-space: -pre-wrap;     /* Opera 4-6 */
    white-space: -o-pre-wrap;   /* Opera 7 */
    white-space: -moz-pre-wrap; /* Mozilla */
    white-space: -hp-pre-wrap;  /* HP Printers */
    word-wrap: break-word;      /* IE 5+ */
}

Идея состоит в том, чтобы использовать их все, чтобы улучшить кроссбраузерность.

Надеюсь это поможет

Я удивлен, что никто не упомянул одно из моих любимых решений этой проблемы - тег <wbr> (необязательный перенос строки). Это довольно хорошо поддерживается в браузерах и, по сути, сообщает браузеру, что может вставляет разрыв строки, если это необходимо. Есть также связанный с этим символ пробела нулевой ширины, &#8203; с тем же значением.

Для упомянутого варианта использования, отображающего комментарии пользователей на веб-странице, я бы предположил, что уже существует некоторое форматирование вывода для предотвращения атак с помощью инъекций и т. д. Таким образом, просто добавить эти теги <wbr> через каждые символы N в слишком длинных словах, или в ссылках.

Это особенно полезно, когда вам нужен контроль над форматом вывода, что не всегда позволяет CSS.

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

(Он разбивается на 15 символов и добавляется между ними "& shy;", но вы можете легко изменить это в коде)

//the function:
BreakLargeWords = function (str)
{
    BreakLargeWord = function (word)
    {
        var brokenWords = [];
        var wpatt = /\w{15}|\w/igm;
        while (wmatch = wpatt.exec(word))
        {
            var brokenWord = wmatch[0];
            brokenWords.push(brokenWord);
            if (brokenWord.length >= 15) brokenWords.push("&shy;");
        }
        return brokenWords.join("");
    }

    var match;
    var word = "";
    var words = [];
    var patt = /\W/igm;
    var prevPos = 0;
    while (match = patt.exec(str))
    {
        var pos = match.index;
        var len = pos - prevPos;
        word = str.substr(prevPos, len);

        if (word.length > 15) word = BreakLargeWord(word);

        words.push(word);
        words.push(match[0]);
        prevPos = pos + 1;
    }
    word = str.substr(prevPos);
    if (word.length > 15) word = BreakLargeWord(word);
    words.push(word);
    var text = words.join("");
    return text;
}

//how to use
var bigText = "Why is this text this big? Lets do a wrap <b>here</b>! aaaaaaaaaaaaa-bbbbb-eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
var goodText = BreakLargeWords(bigText);

Добавьте к строке пространство нулевой ширины (&#8203;), и она будет перенесена.

Вот пример Javacript:

let longWordWithOutSpace = 'pneumonoultramicroscopicsilicovolcanoconiosis';
// add &#8203; between every character to make it wrap
longWordWithOutSpace.split('').join('&#8203;');

Другие вопросы по теме