Показать сообщение отдельно
Старый 27.09.2003, 13:59
Crazy вне форума Посмотреть профиль Отправить личное сообщение для Crazy Посетить домашнюю страницу Crazy Найти все сообщения от Crazy
  № 24  
Crazy
 
Аватар для Crazy

Регистрация: Dec 2001
Сообщений: 4,159
Цитата:
Оригинал написал(а) kompadre
Покажи альтернативу, напиши функцию врапа со всеми постулатами.
Легко:

PHP код:
<?php

define
('MAX_WORD_LEN',21);
define('MAX_PART_LEN',15);
define('MIN_PART_LEN',4);

function 
split_long_words($text) {
  return 
preg_replace_callback('/([^ \t\r\n-]{'.MAX_WORD_LEN.',})/','_split_long_word',$text);
}

function 
_split_long_word($matched) {
  
$word $matched[1];
  
$temp '';
  
$charsLeft strlen($word);
  
$offset 0;
  while (
$charsLeft>0) {
    if (
$charsLeft>MAX_PART_LEN)
      if (
$charsLeft-MAX_PART_LEN>=MIN_PART_LEN)
        
$partLen MAX_PART_LEN;
      else
        
$partLen $charsLeft-MIN_PART_LEN;
    else
      
$partLen $charsLeft;
    
$temp .= ' '.substr($word,$offset,$partLen);
    
$offset += $partLen;
    
$charsLeft -= $partLen;
  }
  return 
substr($temp,1);
}

$text "дизоксирибонуклеиновая кислота";

$text1 split_long_words($text);

echo 
"\n--------------\n$text1";

$text2 wordwrap($text,MAX_WORD_LEN," ",1);

echo 
"\n--------------\n$text2";

?>
Выдача:

Код:
--------------
дизоксирибонукл еиновая кислота
--------------
дизоксирибонуклеинова я кислота
Отрыв одиночной буквы -- однозначно хуже, чем оторвать фрагмент заметного размера.

Далее: за 10 минут можно научить скрипт находить сравнительно удобные места для резки, чтобы результат меньше царапал ухо. Но обычно сие не требуется.
__________________
GIT d++ s++:++ a C++$ UB++ P++ L+ E+ W+++ N++ w++ O+ M V- t-- 5-- X+ R+++ tv- b+++ D++