|
|
Перенос и разбиение слов в HTML
При создании различных лент новостей и колонок онлайн газет, web дизайнеры и программисты сталкиваются с ситуацией, когда в тексте попадается очень длинное слово (синхрофазотрон). Браузер при форматировании разбивает текст в тех местах, где есть пробелы (дефисы). Длинные слова при этом остаются нетронутыми, что часто приводит к "разъезжанию" ячеек таблицы, неаккуратному внешнему виду. Каким образом можно решить эту проблему?
А решить эту проблему можно PHP функцией.
Позаимствованая с сайта http://www.enlight.ru/ib/tech/split/index.htm
-
# -----------------------------------------------------------------------------
-
# Если в строке $s встречается слово (последовательность символов без пробелов)
-
# длиннее чем $wordmaxlen , оно ограничивается тэгами $leftlimit, $rightlimit и
-
# разбивается тэгами $hyp на несколько слов, каждое из которых не
-
# длиннее $wordmaxlen. Тэги бывшие в $s изначально - не затрагиваются.
-
#
-
# Примеры:
-
# ($s,2,'','','')
-
# ($s,2,'','','')
-
# ($s,2,'','','')
-
# ($s,2,'','','')
-
# -----------------------------------------------------------------------------
-
-
function SplitText($s,$wordmaxlen,$leftlimit,$rightlimit,$hyp)
-
{
-
-
$marker = "\x01";
-
-
# Сохраняем все тэги чтобы уберечь их от разбивки
-
preg_match_all('/(<.>)/si',$s,$tags);
-
-
# Заменяем все тэги на маркеры
-
$s = preg_replace('/(<.>)/si', $marker, $s);
-
-
# Разбиваем текст на слова
-
$words = split(' ',$s);
-
-
for ($i=0; $icount($words); $i++)
-
{
-
# Каждое слово >= $wordmaxlen разбиваем
-
if (strlen($words[$i])>=$wordmaxlen)
-
$words[$i] = $leftlimit . chunk_split($words[$i],$wordmaxlen,$hyp) . $rightlimit;
-
}#for
-
-
# Собираем строку из уже разбитых на части слов
-
$s = implode(' ',$words);
-
-
# Восстанавливаем тэги, места которых были отмечены маркерами
-
for ($i=0; $icount($tags[1]); $i++)
-
$s = preg_replace("/$marker/si", $tags[1][$i], $s, 1);
-
-
return $s;
-
}#SplitText
Немножко переделав под свои нужды. получилось следующее:
-
function conv_text_br($text)
-
{
-
$wordmaxlen=50;
-
$hyp=" ";
-
$marker = "\x01";
-
preg_match_all('/(<.>)/si',$text,$tags);
-
$text = preg_replace('/(<.>)/si', $marker, $text);
-
$words = split(' ',$text);
-
-
for ($i=0; $icount($words); $i++)
-
{
-
if (strlen($words[$i])>=$wordmaxlen)
-
$words[$i] = chunk_split($words[$i],$wordmaxlen,$hyp);
-
}
-
$text = implode(' ',$words);
-
for ($i=0; $icount($tags[1]); $i++)
-
$text = preg_replace("/$marker/si", $tags[1][$i], $text, 1);
-
return $text;
-
}
Возможно кто то ломает голову над этой проблемой, вот вам решение.
Работает во всех браузерах.
Чт, 11/19/2009 - 14:24 — X3M-Slider
|
|
Комментарии
разбиение
Все конечно хорошо, но этого же можно добиться одной функцией wordwrap()
Возможно и так, только вопрос
Возможно и так, только вопрос в какой версии пхп она появилась?
Отправить комментарий