Обработка строк

Linker

Guest
Обработка строк

Возможно ли написать функцию и стоит ли игра свеч ?

Вот, к примеру, если ввести длинную строку без пробельных символов, (по злому умыслу или случайно) весь дизайн "разопрёт" по горизонтали.
Если прогонять строку через WordWrap, то, конечно, проблема решается, но возникает другая:

разные символы имеют разную ширину, не говоря уже о регистре этих символов, а это означает, что для 100% гарантии,
необходимо рассчитать максимально допустимую длину строки которая только может быть, т.е. найти символ, который
займёт в строке больше всех места, например "WWWWW" или "ЫЫЫЫЫ".

Но тогда обычный текст, который по ширине занимает меньше места, тоже будет обрезан через определённое количество
символов, что испортит весь дизайн.

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

Linker

Guest
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

Я очень извиняюсь, что немного испортил внешний вид этого замечательного форума, но это для примера.

Так вот я об этой проблеме спрашиваю - это решаемо посредством PHP или нет ?
 

netdog

net @
2 Linker
Это он к тому что внутри этих
тегов все символы по ширине будут одинаковые.

А если без <pre> то практически ничего толкового ты вряд ли сделаешь, у каждого шрифта разнной ширины символ...
 

aloner

Guest
Режешь на куски слова длинее, например, 30 символов.

И все.
 

Linker

Guest
To aloner:
А толку-то? От явного "баловства" спасёт, но зато нормальный текст "кастрирует".
 

Linker

Guest
To Net Dog:
Я это и хотел услышать - что ничего не выйдет с моей затеей.
 

aloner

Guest
Автор оригинала: Linker
To aloner:
А толку-то? От явного "баловства" спасёт, но зато нормальный текст "кастрирует".
Этопотвоемунормальныйтекс?
Покажи мне слово на 30 символов. :)
 

Linker

Guest
To aloner:

Не сразу проникся идеей, прошу прощения.

Вот, что-то вроде этого?
$part = strtok($string, " ");

while ($part):
$parts[] = $part;
$part = strtok(" ");
endwhile;

$count = count($parts)+1;

for ($i=0; $i < $count; $i++):
if (isset($parts[$i]) && strlen($parts[$i]) > 17):
$parts[$i] = wordwrap($parts[$i], 17, "<br>", 1);
endif;
endfor;

$result = implode(" ", $parts);

Т.е. "слово" - это то, что разделено пробелами.
Может у кого есть варианты по-лучше?
Или хотя-бы этот по критикуйте.
Заранее спасибо.
 

RomikChef

Guest
Совершенно непонятная функция.
Во-первых, все это делается одной командой
wordwrap($string,17," ",1);
Во-вторых, почему разбивать надо обязательно <br>-ом?
в-третьих, вот это
$part = strtok($string, " ");
while ($part):
$parts[] = $part;
$part = strtok(" ");
endwhile;
заменяется одной командой explode(" ",$string);
 

Linker

Guest
To RomikChef:

Но ведь wordwrap будеть бить строку через каждые 17 символов не зависимо от того какие это символы? Я же пытаюсь разбить куски строки которые разделены пробелами и которые длиннее 17 символов.

<br> - для примера, лучьше пробел.

За остальное - спасибо !
 

.des.

Поставил пиво кому надо ;-)
Linker ты бы вообще прочитал ссылки которые я тебе привел. Там все решается.. и получишь ты свой "резиновый" текст.
 

Linker

Guest
С пробелом не пробовал, а вот конструкция:

$str = wordwrap($str,17,"<br> ",1);

вставляет "<br>" через каждые 17 символов.
Возможно потому, что в начальной строке нет ни одного "<br>"?
 

.des.

Поставил пиво кому надо ;-)
Мда как все глухо :( Linker ты я посмотрю тоже писатель, а не читатель.
 

Linker

Guest
To .des. :
Да, спасибо, уже читаю, только я их вчера уже просмотрел, бегло, правда, но раз там, как говорите, есть решение, тогда всё :)
 

RomikChef

Guest
возможно.
то есть, не возможно, а совершенно логично
 

.des.

Поставил пиво кому надо ;-)
Привожу решение, между прочим оно было 2 постом по той ссылке которую я привел первой.
$text="Твой текст с твоими длиииииииииииииииииииииииииииииииииными словами!";
$text=preg_replace('/(\S{18})(\S\S)+/s','\1<br>\2',$text);

Note: цифру 18 и <br> заменить на нужное!
 

Linker

Guest
С вами приятно иметь дело :)

Последний вопрос - почему на ваш взгляд в большинстве форумов, гостевых и т.д. не реализованы подобные механизмы защиты от "разъезжания" по-горизонтали ?
Может потому, что это не возможно?
 
Сверху