Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Разрыв длинных слов вне тэгов, чтобы страница не «разъезжалась» по горизонтали. (Дмитрий Котеров)
Author Message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Sat Feb 26, 2005 11:14 pm (написано за 3 минуты 6 секунд)
   Post subject: Разрыв длинных слов вне тэгов, чтобы страница не «разъезжалась» по горизонтали.
Reply with quote

На этом форуме реализовано так.
Предположим, есть очень длинная строкааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа
и очень длинная ssylka.ssylka.ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka/ssylka.html
Code (php): скопировать код в буфер обмена
// Maximum length of word in posting (if larger - replaced
// with <span title="..">...</span>).
define (www.php.net/define)("DK_MAX_WORD_LEN", 50);
define (www.php.net/define)("DK_MAX_WORD_LEN_FRACTION", 0.7);
Code (php): скопировать код в буфер обмена
// Version 1.03.
// Replace long_lines_outside_tags with
// <span title="long_lines_outside_tags">long_line...e_tags</span>.
// ATTENTION: this function is used for ALREADY QUOTED HTML code,
// e.g. all non-tag "<" must be replaced with &lt; etc.
function dk_bbcode_shrink_long($s)
{
  $num = floor (www.php.net/floor)(DK_MAX_WORD_LEN * 1.2);
  // PCRE cannot work with (?:a|b){X,Y} optimal - try "zzzz..." 2000
  // times to crash the function! Do not add multiplicity qualifiers
  // (like *, +, {} etc.) after LARGE (?:a|b)'s.
  return preg_replace_callback (www.php.net/preg_replace_callback)(
    '{
      ((?> # disable back-tracking - improves speed
        [^-%()\[\]{}!?\s<>]   # non-break (this INCLUDES entities!)
        {'
.$num.',} # entities are longer then 1 char! So {$num} is
                    # not quite correct, but we have no choise.
      ))
      (?= [^<>]* (?: < | $))
    }sxi'
,
    'dk_bbcode_shrink_long_callback',
    $s
  );
}

function dk_bbcode_shrink_long_callback($p)
{
  // IE word breaks: http://www.cs.tut.fi/~jkorpela/html/nobr.html
  $s = $p[1];
  $maxlen = DK_MAX_WORD_LEN;
  $fraction = DK_MAX_WORD_LEN_FRACTION;
  $lLeft = floor (www.php.net/floor)($maxlen * $fraction);
  $lRight = floor (www.php.net/floor)($maxlen * (1-$fraction));
  $char = '(?: [^&] | &\\#?\w+; )'; // character or entity.
  // It is possible that we enter this function with not enough characters
  // (including entities) in the match. Then - do nothing, string is not
  // long enough (e.g. "&amp;&amp;...&amp;").
  if (!preg_match (www.php.net/preg_match)("/^ ($char\{$lLeft}) (.*) ($char\{$lRight}) $/sxi", $s, $p))
    return $s;
  list ($left, $middle, $right) = array (www.php.net/array)($p[1], $p[2], $p[3]);
  $fulllen = $maxlen * 2;
  preg_match_all (www.php.net/preg_match_all)("/($char\{1,$fulllen})/sx", $s, $parts, PREG_PATTERN_ORDER);
  $full = join (www.php.net/join)("&#183;&#13;", $parts[1]);
  $s =
    '<span class="shrinked" title="' . str_replace (www.php.net/str_replace)('"', '&quot;', $full) . '">' .
      '<span class="shrinked-left">' . $left . '</span>' .
      '<span style="display:none">'. $middle . '</span>' .
      '<span class="shrinked-right">' . $right . '</span>' .
    '</span>';
  return $s;
}
Code (css): скопировать код в буфер обмена
.shrinked { border-bottom: 1px dashed black }
.shrinked-right { padding-left: 10px; background: url(/images/shrinked.gif) left bottom no-repeat; }


Last edited by Дмитрий Котеров on Mon Feb 28, 2005 2:41 am; edited 2 times in total
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Sat Feb 26, 2005 11:24 pm (спустя 10 минут; написано за 1 минуту 44 секунды)
   Post subject:
Reply with quote

Преимущество такого способа в том, что в IE и Mozilla/Firefox по-прежнему корректно работает выделение+копирование текста мышкой, несмотря на то, что он посередине разрывается точками. (Опера 7.23, как обычно, впереди планеты всей - в ней не работает.) См. соответствующий кусок "display:none". Ну и длинный текст всегда можно увидеть, наведя мышь.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Mon Feb 28, 2005 2:42 am (спустя 1 день 3 часа 17 минут; написано за 24 секунды)
   Post subject:
Reply with quote

Пример использования:
Code (php): скопировать код в буфер обмена
$text = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
echo (www.php.net/echo) dk_bbcode_shrink_long($s);
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Tue Jun 28, 2005 3:59 pm (спустя 4 месяца 13 часов 17 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Разрыв длинных слов вне тэгов, чтобы страница не «разъезжалась» по горизонтали (обсуждение).»,
расположенную в форуме Разное :: PHP (28 Июня 2005, 16:59).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Tue Jun 28, 2005 9:15 pm (спустя 5 часов 15 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Разрыв длинных слов вне тэгов: еще вариант решения.»,
расположенную в форуме Склад готовых решений :: PHP (28 Июня 2005, 22:15).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Mon Aug 08, 2005 3:30 pm (спустя 1 месяц 9 дней 18 часов 14 минут; написано за 12 секунд)
   Post subject:
Reply with quote


М

Все вопросы сюда: Разрыв длинных слов вне тэгов, чтобы страница не «разъезжалась» по горизонтали (обсуждение). (forum.dklab.ru/php/heap/BreakOfLongWordsOutsideOfTagsThatThePageDidNotPartAcrossDiscussion.html)
Back to top
View user's profile Send private message Send e-mail
MeherG88
Заглянувший



Joined: 24 Apr 2015
Posts: 2
Карма: 0
   поощрить/наказать

Location: United States

PostPosted: Fri Apr 24, 2015 8:27 am (спустя 9 лет 8 месяцев 15 дней 16 часов 57 минут; написано за 13 секунд)
   Post subject:
Reply with quote

Mycket tacksam för spridning uttrycket också. Vi 'kommer att behöva en stor mängd bistånd mitt i beta!








_____________________________
NoorAlamShahzad
Back to top
View user's profile Send private message
MeherG88
Заглянувший



Joined: 24 Apr 2015
Posts: 2
Карма: 0
   поощрить/наказать

Location: United States

PostPosted: Thu Nov 26, 2015 2:48 pm (спустя 7 месяцев 2 дня 6 часов 20 минут; написано за 28 секунд)
   Post subject:
Reply with quote

Преимущество такого способа в том, что в IE и Mozilla/Firefox по-прежнему корректно работает выделение+копирование текста мышкой,
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML