Forum Webscript.Ru

Программирование => Perl => Тема начата: restart2003 от 25 Сентября 2005, 23:08:54

Название: Разбиение длинной строки
Отправлено: restart2003 от 25 Сентября 2005, 23:08:54
Пользователи моего форума часто норовят оставить сообщения, в которых есть длинные слова, типа "пооооооооооооммммммммммммооооооооггггииииииттттее" или "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!". Они иногда вызывают горизонтальную полосу прокрутки.
Хочу написать код, ставящий пробел в последовательность непробельных символов, превышающую по длине n(например 40).
Пытался разными методами, получается плохо.
Вот один из вариантов, на практике работающий криво (Он разбивает сообщение на подстроки по сто символов, и, если внутри какой-то подстроки есть 50 или более непробельных символов подряд, ставит поседине пробел):

my $c= 1 + int length($message)/100 ;
for (my $i=0;$i<$c; $i++)
 {
 $buffer = undef;
 $buffer = substr($message,$i*100,100);

  if($buffer =~ /\\S{50,}/)
  {
  my $part1 = substr($buffer,0,50);
  my $part2 = substr($buffer,50,50);
  $buffer = $part1.\' \'.$part2;
  }
 $message2 .= $buffer;
  }
$message = $message2;
 

Хотелось всё-таки создать нормально работающий код. Своими силами пока не получается.
Название: Разбиение длинной строки
Отправлено: Ivan Kolesnikov от 26 Сентября 2005, 13:54:12

$str =~ s/(\\S{50})(?=\\S)/$1 /g;

Последовательность из 50 непробельных символов, за которыми следует еще один непробельный (его мы не берем, а только заглядываем вперед), то заменяем их на эту последовательность + пробел.
Может быть я и не учел что-то, но на простых примерах работает :).
Название: Разбиение длинной строки
Отправлено: restart2003 от 26 Сентября 2005, 16:23:28
Спасибо.
Так и думал, что опять изобретаю велосипед. Поду подучу регекспы.
Пример заработал.
Модифицировал только немного, чтоб UBBC-теги не резал.