Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Пользовательский ввод - не позволить рвать страничку. (http://forum.oszone.net/showthread.php?t=31028)

Prisoner 19-08-2004 06:10 212831

В самом деле - проклятие :). Доброго времени суток всем.
Опишу задачку. Имеется табличка оформляющая, скажем, комментарий пользователя по какому-нибудь творению, в общем комментарий:

******************************
* * * * * * * * * * * * * * * * * * * * * * * * * **
* * *ник * * * ** ** * * * *о себе * * ** * * *
* * * * * * * * * * * ** * * * * * * * * * * * * * *
******************************
* * * * * * * * * * * ** * * * * * * * * * * * * * **
* * * * * * * * * * * ** * * * * * * * * * * * * * **
* * * * * * * *комментарий * * * * * * ** * **
* * * * * * * * * * * * * * * * * * * ** * * * * * **
* * * * * * * * * * * * * * * * * * * ** * * * * * **
******************************

Таким образом, если все нормально, то все собственно и нормально :). Таблица не едет, страничку не рвет. Но стоит человеку ввести в поле "фио" строку не содержащую ни одного пробела, пусть даже и допустимой длины (естественно, что все поля имеют такое ограничение), то ячейка [1, 1] растягивается и тащит вправо ячейку [1, 2], что сказывается и на ячейках [2, *]. В итоге табличка имеет уже не те размеры какие задумывались и вся страничка выглядит как после направленного взрыва :).

Вопрос собственно в том, чтобы предотвратить такую катастрофу. Можно вставлять пробелы через каждые X символов, но не слишком приятно видеть свое отчество как-нибудь так: "Стани слав", не идет. Какие символы не дают визуальных разрывов строки, но дают знать броузеру, что строку можно перенести - высота таблицы не имеет ограничения.

Какие варианты, господа?

[s]Исправлено: Prisoner, 6:17 19-08-2004[/s]

vadimiron 19-08-2004 11:54 212832

Цитата:

Какие символы не дают визуальных разрывов строки, но дают знать броузеру, что строку можно перенести
То есть?? Ведь строку нужно всё равно разбивать, чтобы её перенести, мы же переносим отдельные части строки.
Возможен такой вариант: использовать знак переноса, чисто на воприятие строка не разбита, но перенесена, то есть: есть такая знаменитая фамилия Череззаборногозадерищенский, а если дальше ещё идёт Афанасий Матвеевич-то это слишком длинно, поэтому мы разрешаем максимум 20 символов в одной строке, и если в этой строке не последовало спейса, то ставим после 20 символа знак переноса "-" а всю остальную часть пишем с новой строки.
Если же совсем углубиться в проблему, можно написать функцию, которая будет переносит по правилам русского языка, то есть по слогам (там вроде несложные правила ):biglaugh:  (если такое ещё не написано)

mar 19-08-2004 13:19 212833

У меня была аналогичная проблема. С одной стороны наджо была не дать злым хакерам вставлять длинное-длинное слово и портить вид таблицы, с другой - надо было не разбивать длинные слова. В результате я разбиваю текст на слова и проверяю размер каждого(понятно, что 90 и 55 - это под размеры моей таблицы :)):
Код:

function string_display_value($value, $n=90) {
    // вставляем разбиение длинного текста на слова       
    
    $words = explode (" ", $value);
    $new_value='';       
    while (list ($key, $val) = each ($words)) {
        if(strlen($val) > 55) // если длина одного слова...
                     $val = wordwrap($val, $n, "\n", 1);
        $new_value.=$val. ' ';
    }
    return $value == '' ? '<br>' : htmlspecialchars($new_value);
}


pauluss 25-08-2004 17:51 212834

Прошу пардона за оффтоп. Не могли бы вы пояснить последнюю строчку. Никогда не использовал такие конструкции.
Код:

return $value == '' ? '<br>' : htmlspecialchars($new_value);
Эквивалентно ли это такой записи?
Код:

if($value=="")
    return"<BR>";
else
    return htmlspecialchars($new_value);

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

mar 25-08-2004 22:20 212835

pauluss
Цитата:

Эквивалентно ли это такой записи
да :) оно и есть, просто когда строка небольшая, так бывает проще писать - читать. (а вообще это дело вкуса :))


Время: 22:12.

Время: 22:12.
© OSzone.net 2001-