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

Разрыв длинных слов вне тэгов: еще вариант решения. (Brutus)
Author Message
Дмитрий Котеров
Администратор



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


PostPosted: Tue Jun 28, 2005 7:10 pm ()
   Post subject:
Reply with quote


М

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





Карма: 388
   поощрить/наказать


PostPosted: Tue Jun 28, 2005 7:10 pm (спустя 1 секунду; написано за 1 минуту 23 секунды)
   Post subject:
Reply with quote

Чистка тем - дело конечно хорошее. Но главное - не переусердствовать и не стереть посты, относящиеся к теме. Напомню удаленную функцию, которая мне лично, очень нравится. Я люблю этой крохе скармливать пользовательские сообщения. Она разрезает слишком длинные строки не портя при этом html-тэги.
Code (php): скопировать код в буфер обмена
function htmlwrap($str, $width = 60, $break = "\n", $nobreak = "", $nobr = "pre", $utf = false) {

  // Split HTML content into an array delimited by < and >
  // The flags save the delimeters and remove empty variables
  $content = preg_split (www.php.net/preg_split)("/([<>])/", $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

  // Transform protected element lists into arrays
  $nobreak = explode (www.php.net/explode)(" ", $nobreak);
  $nobr = explode (www.php.net/explode)(" ", $nobr);

  // Variable setup
  $intag = false;
  $innbk = array (www.php.net/array)();
  $innbr = array (www.php.net/array)();
  $drain = "";
  $utf = ($utf) ? "u" : "";

  // List of characters it is "safe" to insert line-breaks at
  // Do not add ampersand (&) as it will mess up HTML Entities
  // It is not necessary to add < and >
  $lbrks = "/?!%)-}]\\\"':;";

  // We use \r for adding <br /> in the right spots so just switch to \n
  if ($break == "\r") $break = "\n";

  while (list(, $value) = each (www.php.net/each)($content)) {
    switch ($value) {

      // If a < is encountered, set the "in-tag" flag
      case "<": $intag = true; break;

      // If a > is encountered, remove the flag
      case ">": $intag = false; break;

      default:

        // If we are currently within a tag...
        if ($intag) {

          // If the first character is not a / then this is an opening tag
          if ($value{0} != "/") {

            // Collect the tag name   
            preg_match (www.php.net/preg_match)("/^(.*?)(\s|$)/$utf", $value, $t);

            // If this is a protected element, activate the associated protection flag
            if ((!count (www.php.net/count)($innbk) && in_array (www.php.net/in_array)($t[1], $nobreak)) || in_array (www.php.net/in_array)($t[1], $innbk)) $innbk[] = $t[1];
            if ((!count (www.php.net/count)($innbr) && in_array (www.php.net/in_array)($t[1], $nobr)) || in_array (www.php.net/in_array)($t[1], $innbr)) $innbr[] = $t[1];

          // Otherwise this is a closing tag
          } else {

            // If this is a closing tag for a protected element, unset the flag
            if (in_array (www.php.net/in_array)(substr (www.php.net/substr)($value, 1), $innbk)) unset (www.php.net/unset)($innbk[count (www.php.net/count)($innbk)]);
            if (in_array (www.php.net/in_array)(substr (www.php.net/substr)($value, 1), $innbr)) unset (www.php.net/unset)($innbr[count (www.php.net/count)($innbr)]);
          }

        // Else if we're outside any tags...
        } else if ($value) {

          // If unprotected, remove all existing \r, replace all existing \n with \r
          if (!count (www.php.net/count)($innbr)) $value = str_replace (www.php.net/str_replace)("\n", "\r", str_replace (www.php.net/str_replace)("\r", "", $value));

          // If unprotected, enter the line-break loop
          if (!count (www.php.net/count)($innbk)) {
            do {
              $store = $value;

              // Find the first stretch of characters over the $width limit
              if (preg_match (www.php.net/preg_match)("/^(.*?\s|^)(([^\s&]|&(\w{2,5}|#\d{2,4});){".$width."})(?!(".preg_quote($break, "/")."|\s))(.*)$/s$utf", $value, $match)) {

                // Determine the last "safe line-break" character within this match
                for ($x = 0, $ledge = 0; $x < strlen (www.php.net/strlen)($lbrks); $x++) $ledge = max (www.php.net/max)($ledge, strrpos (www.php.net/strrpos)($match[2], $lbrks{$x}));
                if (!$ledge) $ledge = strlen (www.php.net/strlen)($match[2]) - 1;

                // Insert the modified string
                $value = $match[1].substr($match[2], 0, $ledge + 1).$break.substr($match[2], $ledge + 1).$match[6];
              }

            // Loop while overlimit strings are still being found
            } while ($store != $value);
          }

          // If unprotected, replace all \r with <br />\n to finish
          if (!count (www.php.net/count)($innbr)) $value = str_replace (www.php.net/str_replace)("\r", "<br />\n", $value);
        }
    }

    // Send the modified segment down the drain
    $drain .= $value;
  }

  // Return contents of the drain
  return $drain;
}
www.greywyvern.com/code/php/htmlwrap_1.1.php.txt - собственно отсюда я взял скрипт, наверху там обильные комментарии, на английском. Вряд ли имеет смысл дублировать их здесь.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue Jun 28, 2005 9:12 pm (спустя 2 часа 2 минуты; написано за 1 минуту 40 секунд)
   Post subject:
Reply with quote


М

Во-первых, ничего не удаляется - тема была расщеплена, и в отщепленной ветке - ваша функция в том числе. Во-вторых, Вы читали правила этого раздела форума? Рекомендую почитать.

Где описание работы функции?
Где пример использования (желательно - в работающем виде, чтобы можно было сразу посмотреть и оценить)?

В-третьих, одно решение - один топик.
Back to top
View user's profile Send private message Send e-mail
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