|
|
|
| Интересует следующее:
1. Если хулиган введет в текстареа очень длинную строку без пробелов, то она загрузится в броузер в таком же виде, так, что у пользователей в броузере появится горизонтальная прокрутка. Как этого избежать?
2. Как ограничивается длина сообщения: в броузере или на сервере, или и там, и там? | |
|
|
|
|
|
|
|
для: coloboc66
(16.05.2007 в 14:54)
| | Думаю, эффективнее на стороне сервера это делать.... | |
|
|
|
|
|
|
|
для: coloboc66
(16.05.2007 в 14:54)
| | 1. Перед записью сообщения в базу/файл проверять его на наличие пробелов, и если таковых нету, а сообщение превышает допустимый размер, вставлять их насильно.
2. Лучше и там, и там. Что бы не вводить пользователей в заблуждение, о максимальной длине сообщения. | |
|
|
|
|
|
|
|
для: coloboc66
(16.05.2007 в 14:54)
| | пробелы добавляют обычно в таких случаях. На стороне сервера или клиента - это уж кому как нравится. Главное, чтобы если в чате допускается ввод URLs, эти пробелы не рвали содержимое href .... | |
|
|
|
|
|
|
|
для: Trianon
(16.05.2007 в 15:03)
| | А как проверять на наличие пробелов, регулярными выражениями? С ними совсем плохо. Так, что-ли?
$msg=$_POST['msg'];
if(!eregi('^[ ]+$',$msg)
|
| |
|
|
|
|
|
|
|
для: coloboc66
(16.05.2007 в 15:17)
| | У меня есть вот такое решение:
<?
function break_long_text($match)
{
$max_len=30; //строки длиннее 30 символов режем на части
$match[1]=preg_replace('/(\w{'.($max_len).'})/', '$1 ', $match[1]);
return $match[1].$match[2];
}
$text=preg_replace_callback('#([^<>]*)(<[^>]+>)?#', 'break_long_text', $text);
|
| |
|
|
|
|
|
|
|
для: coloboc66
(16.05.2007 в 14:54)
| | Самы простой способ и легко обходимый это в теге textarea добавляешь атрибут maxlength="число символов". А на стороне сервера можно ограничеть вывод сообщений так
#Фун-ция обрезания текста
function sizetext($text)
{
#30 - количество символов
if (strlen($text)<30)
{
$text=$text;
}
else
{
#30 - количество символов, после которых текст обрезается и вставляется многотточие
$text = substr($text,0,30)." ...";
}
return $text;
}
|
За основу брал код с форума, надо пользоваться поиском. | |
|
|
|
|
|
|
|
для: hin
(16.05.2007 в 15:06)
| | Ну вот в скрипте Loki вроде все работает, только выскакивает Notice:
Undefined offset: 2 in <b>z:\home\localhost\www\testdir\test.php</b> on line <b>11</b>
а в строке 11 вот что:
return $match[1].$match[2];
И в самом деле насчет $match[2] не очень понятно... | |
|
|
|
|
|
|
|
для: coloboc66
(16.05.2007 в 16:03)
| | Все просто: подразумевается что в тексте могут присутствовать html теги. Теги, естественно, резать нельзя.
поэтому текст без тега мы помещаем в $match[1], а следующий за ним тег - в $match[2]. Обрабатываем $match[1] и склеиваем строку обратно.
Так как текст или тег присутствую не всегда, отсюда и notice | |
|
|
|
|
|
|
|
для: Loki
(16.05.2007 в 16:34)
| | Но у меня при таком положении вещей:
return $match[1].$match[2];
возвращается оригинальная строка+преобразованная. + уже упомянутый Notice
Почему в качестве $match[1] возвращается оригинальная строка?
А при таком:
return $match[2];
возвращается только преобразованная строка (что, в принципе, и надо).
В общем, ситуация такая: если в тексте есть теги, то все проходит как положено, а если тегов нет, то возвращается оригинальная строка плюс преобразованная.
Каков выход? | |
|
|
|
|
|
|
|
для: coloboc66
(16.05.2007 в 16:58)
| | Можно ещё просто принудительно рвать строку если в слове больше 10 букв :) | |
|
|
|
|
|
|
|
для: LuxeMate
(16.05.2007 в 17:21)
| | а если слово - это ссылка внутри тега? | |
|
|
|
|
|
|
|
для: Loki
(16.05.2007 в 17:23)
| | тогда нельзя :) | |
|
|
|
|
|
|
|
для: coloboc66
(16.05.2007 в 16:58)
| | Только что проверил:
в $match[0] содержится исходная строка
в $match[1] исправленная
в $match[2] тег, если он есть. Или отсутствует
<?
$text='very loooooooooooooooooooooong word';
function break_long_text($match)
{
$max_len=10;
$match[1]=preg_replace('/(\w{'.($max_len).'})/', '$1 ', $match[1]);
return $match[1].$match[2];
}
$text=preg_replace_callback('#([^<>]*)(<[^>]+>)?#', 'break_long_text', $text);
echo $text; //very looooooooo oooooooooo ooong word
?>
|
| |
|
|
|
|
|
|
|
|
для: cheops
(17.05.2007 в 00:53)
| | to Loki: возможно, вы сочтете это странным, но у меня все корректно работает лишь в таком виде:
$text=$_POST['text'];
$text=preg_replace_callback('#([^<>]*)(<[^>]+>)?#', 'break_long_text', $text);
function break_long_text($match)
{
$max_len=20;
$match[2]=preg_replace('/(\w{'.($max_len).'})/', '$1 ', $match[1]);
return $match[2];
}
|
| |
|
|
|
|
|
|
|
для: coloboc66
(17.05.2007 в 11:34)
| |
$match[2]=preg_replace('/(\w{'.($max_len).'})/', '$1 ', $match[1]);
return $match[2];
|
Это логическая ошибка, так как при этом у вас потеряются теги в тексте.
Можно взглянуть ваш пример целиком? вместе со значением переменной $text | |
|
|
|
|
|
|
|
для: Loki
(17.05.2007 в 16:27)
| | Да:это я тормознул, наверное . "Корректно" - это я под себя сказал,т.к. мне как-раз нужно, чтобы теги пользователь не мог вводить вообще. А так логика неизмененного мной скрипта соблюдается, как задумано - теги не режутся. Пока все понятно. Только Notice мешает, как его убрать? | |
|
|
|
|
|
|
|
для: coloboc66
(17.05.2007 в 17:40)
| | Если Вы не разрешаете пользователю вводить теги вообще, самое разумное, что Вы можете сделать, это сделать так, чтоб пользователь вводил текст, который выглядит, как теги. | |
|
|
|
|
|
|
|
для: Trianon
(17.05.2007 в 17:51)
| | "...чтоб пользователь вводил текст, который выглядит, как теги." - ???!!! Можно пример такого текста? | |
|
|
|
|
|
|
|
для: coloboc66
(17.05.2007 в 17:56)
| | Смотрите:
<script type=text/javascript>
alert("Bu!");
</script>
это текст, а не скрипт.
Скрипт бы выполнился и вывалил бы окно поверх экрана.
Это голый плоский текст. | |
|
|
|
|
|
|
|
для: coloboc66
(17.05.2007 в 17:40)
| |
return @$match[1].@$match[2];
|
или
| |
|
|
|
|
|
|
|
для: Loki
(17.05.2007 в 17:51)
| | error_reporting(7);
А это где нужно ставить? Вверху скрипта? | |
|
|
|
|
|
|
|
для: coloboc66
(17.05.2007 в 17:57)
| | >error_reporting(7);
>А это где нужно ставить? Вверху скрипта?
именно | |
|
|
|
|
|
|
|
для: coloboc66
(17.05.2007 в 17:40)
| | Если теги все равно запрещены, то можно ограничиться этим:
<?
$text=preg_replace('/(\w{20})/', '$1 ', $text); //вставляет пробел после каждых 20 букв подряд
|
| |
|
|
|
|
|
|
|
для: Loki
(17.05.2007 в 21:23)
| | А для чего разрешают теги? Я правильно понимаю, что для форматирования строки (ее внешнего вида) по вкусу пользователя? Т.е. он может менять цвет, шрифт, вставлять URL или смайлики? Если да, то мне это в самом деле пока не нужно - это для навороченных громоздких чатов и форумов. Мне нужен необходимый минимум. Я думаю, что заставить все это работать в разных броузерах - довольно трудная задача, т.к. даже данный форум в лисе форматирует вводимое сообщение некорректно... | |
|
|
|