Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как делают в чатах?
 
 автор: coloboc66   (16.05.2007 в 14:54)   письмо автору
 
 

Интересует следующее:
1. Если хулиган введет в текстареа очень длинную строку без пробелов, то она загрузится в броузер в таком же виде, так, что у пользователей в броузере появится горизонтальная прокрутка. Как этого избежать?
2. Как ограничивается длина сообщения: в броузере или на сервере, или и там, и там?

   
 
 автор: mefestofel   (16.05.2007 в 14:57)   письмо автору
 
   для: coloboc66   (16.05.2007 в 14:54)
 

Думаю, эффективнее на стороне сервера это делать....

   
 
 автор: Drago   (16.05.2007 в 15:02)   письмо автору
 
   для: coloboc66   (16.05.2007 в 14:54)
 

1. Перед записью сообщения в базу/файл проверять его на наличие пробелов, и если таковых нету, а сообщение превышает допустимый размер, вставлять их насильно.

2. Лучше и там, и там. Что бы не вводить пользователей в заблуждение, о максимальной длине сообщения.

   
 
 автор: Trianon   (16.05.2007 в 15:03)   письмо автору
 
   для: coloboc66   (16.05.2007 в 14:54)
 

пробелы добавляют обычно в таких случаях. На стороне сервера или клиента - это уж кому как нравится. Главное, чтобы если в чате допускается ввод URLs, эти пробелы не рвали содержимое href ....

   
 
 автор: coloboc66   (16.05.2007 в 15:17)   письмо автору
 
   для: Trianon   (16.05.2007 в 15:03)
 

А как проверять на наличие пробелов, регулярными выражениями? С ними совсем плохо. Так, что-ли?

$msg=$_POST['msg'];
if(!eregi('^[ ]+$',$msg)

   
 
 автор: Loki   (16.05.2007 в 15:33)   письмо автору
 
   для: 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);

   
 
 автор: hin   (16.05.2007 в 15:06)   письмо автору
 
   для: 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;
  }

За основу брал код с форума, надо пользоваться поиском.

   
 
 автор: coloboc66   (16.05.2007 в 16:03)   письмо автору
 
   для: 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] не очень понятно...

   
 
 автор: Loki   (16.05.2007 в 16:34)   письмо автору
 
   для: coloboc66   (16.05.2007 в 16:03)
 

Все просто: подразумевается что в тексте могут присутствовать html теги. Теги, естественно, резать нельзя.
поэтому текст без тега мы помещаем в $match[1], а следующий за ним тег - в $match[2]. Обрабатываем $match[1] и склеиваем строку обратно.
Так как текст или тег присутствую не всегда, отсюда и notice

   
 
 автор: coloboc66   (16.05.2007 в 16:58)   письмо автору
 
   для: Loki   (16.05.2007 в 16:34)
 

Но у меня при таком положении вещей:
return $match[1].$match[2];
возвращается оригинальная строка+преобразованная. + уже упомянутый Notice
Почему в качестве $match[1] возвращается оригинальная строка?
А при таком:
return $match[2];
возвращается только преобразованная строка (что, в принципе, и надо).
В общем, ситуация такая: если в тексте есть теги, то все проходит как положено, а если тегов нет, то возвращается оригинальная строка плюс преобразованная.
Каков выход?

   
 
 автор: LuxeMate   (16.05.2007 в 17:21)   письмо автору
 
   для: coloboc66   (16.05.2007 в 16:58)
 

Можно ещё просто принудительно рвать строку если в слове больше 10 букв :)

   
 
 автор: Loki   (16.05.2007 в 17:23)   письмо автору
 
   для: LuxeMate   (16.05.2007 в 17:21)
 

а если слово - это ссылка внутри тега?

   
 
 автор: LuxeMate   (17.05.2007 в 01:04)   письмо автору
 
   для: Loki   (16.05.2007 в 17:23)
 

тогда нельзя :)

   
 
 автор: Loki   (16.05.2007 в 17:22)   письмо автору
 
   для: 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)   письмо автору
 
   для: coloboc66   (16.05.2007 в 14:54)
 

Возможно вас заинтересует тема по ссылке http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=4580.

   
 
 автор: coloboc66   (17.05.2007 в 11:34)   письмо автору
 
   для: 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];
}

   
 
 автор: Loki   (17.05.2007 в 16:27)   письмо автору
 
   для: coloboc66   (17.05.2007 в 11:34)
 


    $match[2]=preg_replace('/(\w{'.($max_len).'})/', '$1 ', $match[1]);
   return $match[2]; 

Это логическая ошибка, так как при этом у вас потеряются теги в тексте.
Можно взглянуть ваш пример целиком? вместе со значением переменной $text

   
 
 автор: coloboc66   (17.05.2007 в 17:40)   письмо автору
 
   для: Loki   (17.05.2007 в 16:27)
 

Да:это я тормознул, наверное . "Корректно" - это я под себя сказал,т.к. мне как-раз нужно, чтобы теги пользователь не мог вводить вообще. А так логика неизмененного мной скрипта соблюдается, как задумано - теги не режутся. Пока все понятно. Только Notice мешает, как его убрать?

   
 
 автор: Trianon   (17.05.2007 в 17:51)   письмо автору
 
   для: coloboc66   (17.05.2007 в 17:40)
 

Если Вы не разрешаете пользователю вводить теги вообще, самое разумное, что Вы можете сделать, это сделать так, чтоб пользователь вводил текст, который выглядит, как теги.

   
 
 автор: coloboc66   (17.05.2007 в 17:56)   письмо автору
 
   для: Trianon   (17.05.2007 в 17:51)
 

"...чтоб пользователь вводил текст, который выглядит, как теги." - ???!!! Можно пример такого текста?

   
 
 автор: Trianon   (17.05.2007 в 18:08)   письмо автору
 
   для: coloboc66   (17.05.2007 в 17:56)
 

Смотрите:

<script type=text/javascript>
alert("Bu!");
</script>

это текст, а не скрипт.
Скрипт бы выполнился и вывалил бы окно поверх экрана.
Это голый плоский текст.

   
 
 автор: Loki   (17.05.2007 в 17:51)   письмо автору
 
   для: coloboc66   (17.05.2007 в 17:40)
 


return @$match[1].@$match[2];

или

error_reporting(7);

   
 
 автор: coloboc66   (17.05.2007 в 17:57)   письмо автору
 
   для: Loki   (17.05.2007 в 17:51)
 

error_reporting(7);
А это где нужно ставить? Вверху скрипта?

   
 
 автор: ddhvvn   (17.05.2007 в 18:08)   письмо автору
 
   для: coloboc66   (17.05.2007 в 17:57)
 

>error_reporting(7);
>А это где нужно ставить? Вверху скрипта?


именно

   
 
 автор: Loki   (17.05.2007 в 21:23)   письмо автору
 
   для: coloboc66   (17.05.2007 в 17:40)
 

Если теги все равно запрещены, то можно ограничиться этим:
<?
$text
=preg_replace('/(\w{20})/''$1 '$text); //вставляет пробел после каждых 20 букв подряд

   
 
 автор: coloboc66   (18.05.2007 в 09:24)   письмо автору
 
   для: Loki   (17.05.2007 в 21:23)
 

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования