Вверх

Блог
RSS лента

Перенос и разбиение слов в HTML

Vape Shop Эко Заправка

При создании различных лент новостей и колонок онлайн газет, web дизайнеры и программисты сталкиваются с ситуацией, когда в тексте попадается очень длинное слово (синхрофазотрон). Браузер при форматировании разбивает текст в тех местах, где есть пробелы (дефисы). Длинные слова при этом остаются нетронутыми, что часто приводит к "разъезжанию" ячеек таблицы, неаккуратному внешнему виду. Каким образом можно решить эту проблему?

А решить эту проблему можно PHP функцией.
Позаимствованая с сайта http://www.enlight.ru/ib/tech/split/index.htm

  1. # -----------------------------------------------------------------------------
  2. # Если в строке $s встречается слово (последовательность символов без пробелов)
  3. # длиннее чем $wordmaxlen , оно ограничивается тэгами $leftlimit, $rightlimit и
  4. # разбивается тэгами $hyp на несколько слов, каждое из которых не
  5. # длиннее $wordmaxlen. Тэги бывшие в $s изначально - не затрагиваются.
  6. #
  7. # Примеры:
  8. # ($s,2,'<nobr>','</nobr>','<wbr>')
  9. # ($s,2,'','','<wbr>')
  10. # ($s,2,'','','&shy;')
  11. # ($s,2,'','','&shy;<wbr>')
  12. # -----------------------------------------------------------------------------
  13.  
  14. function SplitText($s,$wordmaxlen,$leftlimit,$rightlimit,$hyp)
  15. {
  16.  
  17. $marker = "\x01";
  18.  
  19. # Сохраняем все тэги чтобы уберечь их от разбивки
  20. preg_match_all('/(<.*?\>)/si',$s,$tags);
  21.  
  22. # Заменяем все тэги на маркеры
  23. $s =  preg_replace('/(<.*?\>)/si', $marker, $s);
  24.  
  25. # Разбиваем текст на слова
  26. $words = split(' ',$s);
  27.  
  28. for ($i=0; $i<count($words); $i++)
  29. {
  30. # Каждое слово >= $wordmaxlen разбиваем
  31.  if (strlen($words[$i])>=$wordmaxlen)
  32.     $words[$i] = $leftlimit . chunk_split($words[$i],$wordmaxlen,$hyp) . $rightlimit;
  33. }#for
  34.  
  35. # Собираем строку из уже разбитых на части слов
  36. $s = implode(' ',$words);
  37.  
  38. # Восстанавливаем тэги, места которых были отмечены маркерами
  39. for ($i=0; $i<count($tags[1]); $i++)
  40.    $s =  preg_replace("/$marker/si", $tags[1][$i], $s, 1);
  41.  
  42. return $s;
  43. }#SplitText

Немножко переделав под свои нужды. получилось следующее:

  1. function conv_text_br($text)
  2. {
  3.  $wordmaxlen=50;
  4.  $hyp="<br>";
  5.  $marker = "\x01";
  6.  preg_match_all('/(<.*?\>)/si',$text,$tags);
  7.  $text =  preg_replace('/(<.*?\>)/si', $marker, $text);
  8.  $words = split(' ',$text);
  9.  
  10.  for ($i=0; $i<count($words); $i++)
  11.  {
  12.   if (strlen($words[$i])>=$wordmaxlen)
  13.     $words[$i] = chunk_split($words[$i],$wordmaxlen,$hyp);
  14.  }
  15.  $text = implode(' ',$words);
  16.  for ($i=0; $i<count($tags[1]); $i++)
  17.    $text =  preg_replace("/$marker/si", $tags[1][$i], $text, 1);
  18.   return $text;
  19. }

Возможно кто то ломает голову над этой проблемой, вот вам решение.
Работает во всех браузерах.

Ваша оценка: Пусто Средняя: 3.8 (18 votes)

Комментарии

разбиение

Все конечно хорошо, но этого же можно добиться одной функцией wordwrap()

Возможно и так, только вопрос

Возможно и так, только вопрос в какой версии пхп она появилась?

Главная | Портфолио | Услуги | Контакты | Блог