Sardonix
Новичок
Форматированный вывод текста: деление длинной строки
Уважаемые господа-программисты, имеется проблема с выводом строки.
Например, есть строка "Съешь ещё этих мягких французских булочек!
Ну, пожааааааааааааааааааааааааааааааааааааааааааааааааааалуйста!"
В этой строке все длинные лексемы (в данном случае,
"пожааааааааааааааааааааааааааааааааааааааааааааааааааалуйста!"),
т.е., лексемы, имеющие длину, больше определенной - ну, скажем,
20 символов - нужно поделить на части не более этой определенной
длины; разделителем должен быть пробел или "- " (тире с пробелом -
т.е.,эмитация переноса). Все остальные лексемы и разделяющие их
пробелы должны остаться без изменений.
Постараюсь подробно и четко описать свои действия и обрисую, с чем,
собственно, возникла проблема.
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
NB : закон изменения : $i=0; $i=$i+2;
===============================
Объединяем всё в общий код:
_________________________
Скрипт работает - это проверено.
Вот результат его исполнения:
"Съешь ещё этих мягких французских булочек.
Ну, пожааааааааааааааааа -
аааааааааааааааааааа -
аааааааааааааалуйста - ! -"
Проблемы:
=========
1) Как вы, наверное, заметили -
в конце отформатированного текста имеется пробел и "-" - как от них избавиться?
2) Скрипт кажется мне каким-то некузявым, слишком громоздким, а известно, что некрасивое не может быть правильным.
Нельзя ли как-нибудь рацианализировать этот алгоритм с целью упрощения?
Уважаемые господа-программисты, имеется проблема с выводом строки.
Например, есть строка "Съешь ещё этих мягких французских булочек!
Ну, пожааааааааааааааааааааааааааааааааааааааааааааааааааалуйста!"
В этой строке все длинные лексемы (в данном случае,
"пожааааааааааааааааааааааааааааааааааааааааааааааааааалуйста!"),
т.е., лексемы, имеющие длину, больше определенной - ну, скажем,
20 символов - нужно поделить на части не более этой определенной
длины; разделителем должен быть пробел или "- " (тире с пробелом -
т.е.,эмитация переноса). Все остальные лексемы и разделяющие их
пробелы должны остаться без изменений.
Постараюсь подробно и четко описать свои действия и обрисую, с чем,
собственно, возникла проблема.
1)
PHP:
//получаю строку и очищаю ее от возможных html-тегов
$edit = strip_tags($_POST['edit']);
PHP:
//проверяю пустотность строки
if (!$edit)
{
echo ("Строка пуста!");
exit();
}
PHP:
//определяю позицию первого пробела в обрабатываемой строке
$pos = strpos($edit," ");
if ($pos === false)
echo ("Пробел не найден!")
else
echo ("Пробел в позиции ",$pos);
PHP:
/* если длина подстроки от начала обрабатываемой строки до 1-го пробела
меньше или равна заданному количеству символов - копируем подстроку в массив подстрок */
$substr_array[$i]=substr($edit,0,$pos);
PHP:
//добавляем в массив подстрок разделяющий пробел
$substr_array[$i+1]=" ";
PHP:
//удаляем скопированную подстроку из исходной строки
$edit = substr($edit,$pos,strlen($edit));
PHP:
/* если длина подстроки от начала строки или от предыдущего пробела
до следующего пробела больше заданного количества символов -
делим строку */
$substr_array[$i]=substr($edit,0,20);
PHP:
//удаляем скопированную подстроку из исходной строки
$edit = substr($edit,20,strlen($edit));
PHP:
//добавляем в массив подстрок разделяющий пробел
$substr_array[$i+1]="- ";
PHP:
//объединяем все подстроки массива подстрок в единую строку
$new_edit = join(" ",$substr_array);
===============================
Объединяем всё в общий код:
_________________________
PHP:
//получаю строку и очищаю ее от возможных html-тегов
$edit = strip_tags($_POST['edit']);
//проверяю пустотность строки
if (!$edit)
{
echo ("А строка-то пуста :( ");
exit();
}
$i=0;
while (strlen($edit) > 0)
{
$pos = strpos($edit," ");
if ($pos === false)
{
//пробелы не найдены вообще
//echo ("Пробел не найден!")
$substr_array[$i] = substr($edit,0,20);
$substr_array[$i+1] = "- ";
$edit = substr($edit,20,strlen($edit));
}
else
{
//пробел найден
//echo ("Пробел в позиции ",$pos);
if ($pos <= 20)
{
//позиция пробела ближе 20 символов
$substr_array[$i]=substr($edit,0,$pos);
$substr_array[$i+1] = " ";
$edit = substr($edit,$pos+1,strlen($edit));
}
else
{
//позиция пробела дальше 20 символов
$substr_array[$i] = substr($edit,0,20);
$substr_array[$i+1] = "- ";
$edit = substr($edit,20,strlen($edit));
}
}
$i=$i+2;
}
//объединяем все подстроки массива подстрок в единую строку
@$new_edit = join(" ",$substr_array) or die ("Шут его знает где, но где-то возникла ошибка :( ");
echo ($new_edit);
Вот результат его исполнения:
"Съешь ещё этих мягких французских булочек.
Ну, пожааааааааааааааааа -
аааааааааааааааааааа -
аааааааааааааалуйста - ! -"
Проблемы:
=========
1) Как вы, наверное, заметили -
в конце отформатированного текста имеется пробел и "-" - как от них избавиться?
2) Скрипт кажется мне каким-то некузявым, слишком громоздким, а известно, что некрасивое не может быть правильным.
Нельзя ли как-нибудь рацианализировать этот алгоритм с целью упрощения?