Войти

Показать полную графическую версию : Пользовательский ввод - не позволить рвать страничку.


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

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

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

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

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

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

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

mar
19-08-2004, 13:19
У меня была аналогичная проблема. С одной стороны наджо была не дать злым хакерам вставлять длинное-длинное слово и портить вид таблицы, с другой - надо было не разбивать длинные слова. В результате я разбиваю текст на слова и проверяю размер каждого(понятно, что 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
Прошу пардона за оффтоп. Не могли бы вы пояснить последнюю строчку. Никогда не использовал такие конструкции.

return $value == '' ? '<br>' : htmlspecialchars($new_value);

Эквивалентно ли это такой записи?

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


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

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




© OSzone.net 2001-2012