Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Перенос строки по указанному количеству символов (https://javascript.ru/forum/server/27588-perenos-stroki-po-ukazannomu-kolichestvu-simvolov.html)

kilogram 17.04.2012 22:25

Перенос строки по указанному количеству символов
 
Есть текст: Привет малыш! Как дела?
Нужно перенести слово "малыш" между слловами "Как дела?", чтоб получился в итоге текст:
Привет! Как малыш дела? Слышал что вроде есть функция wordwrap. Что-то она не срабатывает для такого дела. Или этой функцией такое не сделать, нужно один текст заменять на другой функцией str_replace или strtr, этот вариант не покатит с помощью этой функции?
<html><body>
<?php
$t = "Привет малыш! Как  дела?";
echo wordwrap($t,8," ");
?>
</body></html>

T-sh 17.04.2012 23:44

нет, wordwrap — перенос части строки на новую строку.

т.е. с помощью wordwrap можно сделать так:

$str = "Привет, малыш! Как дела?";
$str2 = wordwrap(str,15);

$str2 равна "Привет, малыш!<br/>Как дела?":
Привет, малышь!
Как дела?


Чтобы меня слова местами нужно заменять подстроки, либо обращаться к строке как к массиву и пенять местами элементы.

kilogram 17.04.2012 23:55

Только перенос слов?Какая-то функция ненужная.
<?php
$str = "Привет, малыш! Как дела?";
$str2 = wordwrap($str,15,"<br />"); 
echo $str2; 
?>

T-sh 18.04.2012 00:01

Цитата:

Сообщение от kilogram (Сообщение 169650)
Только перенос слов?Ккакая-то функция ненужная.
<?php
$str = "Привет, малыш! Как дела?";
$str2 = wordwrap($str,15,"<br />"); 
echo $str2; 
?>

<br> указывать необязательно, он по умолчанию идёт вроде

нужная функция :) когда в очень длинную строку нужно добавить разделители через определенную длину — wordwrap срабатывает значительно быстрее других способов.

kilogram 18.04.2012 00:47

Код:

<html><body>
<?php
function cite($ourText, $maxlen=60, $prefix="> "){
        $st = wordwrap($ourText,$maxlen-strlen($prefix),"\n");
        $st = $prefix.str_replace("\n","\n$prefix",$st);
        return $st;
}
echo '<pre>';
echo cite("Томас Джефферсон, один из авторов Декларации независимости, писал,
 что «все люди созданы равными». При этом однако третий президент США всю
жизнь оставался рабовладельцем. Сейчас в Америке проходят две выставки, в
 центре внимания которых – это парадоксальное расхождение между идеями
Джефферсона и его образом жизни. Наш корреспондент Джули Табо рассказывает
 подробнее об экспозиции в его знаменитой усадьбе Монтиселло. Смотрите видео.",20);
echo '</pre>';
?>
</body></html>

Растолкуйте пожалуйста вот эти 2 строки:
$st = wordwrap($ourText,$maxlen-strlen($prefix),"\n");
	$st = $prefix.str_replace("\n","\n$prefix",$st);

Что вот это за действие? $prefix.str_replace почему точка "."?
Что делает первая строка?

T-sh 18.04.2012 01:01

1. первая строка кода в строке $ourText через каждый 18 символов добавляет перенос строки \n

18, потому что функции в качестве второго аргумента передаётся 20, а в качестве третьего — "> ".
$maxlen-strlen($prefix) = 20 минус (длина третьего аргумента).

2. str_replace("\n","\n$prefix",$st);
замена символа переноса строки на перенос строки + "> "

$st = $prefix.str_replace("\n","\n$prefix",$st);

точка — конкатенация, т.е. склеивание строк.
$st станет равна "> "+ то, что получится после замены :)

kilogram 18.04.2012 01:15

Передача 2 параметру было 20, значит переменная $maxlen перелпределяется в значение 20. В строке 20-2=18 символов вывести на одну строку?
$maxlen-strlen($prefix)

T-sh 18.04.2012 01:18

Цитата:

Сообщение от kilogram (Сообщение 169656)
Передача 2 параметру было 20, значит переменная $maxlen перелпределяется в значение 20. В строке 20-2=18 символов вывести на одну строку?
$maxlen-strlen($prefix)

дословно это будет звучать так: перед каждым 18-ым символом строки добавить символ переноса.

kilogram 18.04.2012 01:34

Попробовал в этой строке убрать $prefix. вывело все то же самое, только в первой строке не поставило перед текстом знак ">",а в остальных строках поставило. получается конкатенация в этом месте с переменной $prefix. нужна лишь для первой строки?
Код:

$st = $prefix.str_replace("\n","\n$prefix",$st);

T-sh 18.04.2012 01:38

Цитата:

Сообщение от kilogram (Сообщение 169659)
Попробовал в этой строке убрать $prefix. вывело все то же самое, только в первой строке не поставило перед текстом знак ">",а в остальных строках поставило. получается конкатенация в этом месте с переменной $prefix. нужна лишь для первой строки?
Код:

$st = $prefix.str_replace("\n","\n$prefix",$st);

да, конкатенация здесь только для того, чтоб перед первой строкой вывести "> "

kilogram 18.04.2012 01:45

"\n" - это перевод строки для внутреннего кода, но не при выводе на экран, для вывода на экран используется <br>. Скажите, почему <br> не стоит в этом коде, но после каждых 18 символов переход происходить на след.строку? Ведь в функции wordwrap в качестве перевода строки стоит \n но не br, следовательно если \n тогда на экране не должно переводить, переводить должно только если br разделитель.

T-sh 18.04.2012 01:58

Цитата:

Сообщение от kilogram (Сообщение 169663)
"\n" - это перевод строки для внутреннего кода, но не при выводе на экран, для вывода на экран используется <br>. Скажите, почему <br> не стоит в этом коде, но после каждых 18 символов переход происходить на след.строку? Ведь в функции wordwrap в качестве перевода строки стоит \n но не br, следовательно если \n тогда на экране не должно переводить, переводить должно только если br разделитель.

<br /> — это html тег.
а \n — это escape-последовательность

т.е. <br> переносит строку только когда имеем дело с html, а \n — работает везде (редакторы, программы и т.д.)

в html они выполняют почти одну и туже функцию — переносят строку, но есть одно различие: если поле, где осуществляется перевод однострочное, к примеру, <input type='text'> или <input type='password'>, <input type='date'>, то <br> не сработает, \n работает всегда.

<br /> — это просто тег, который обрабатывает браузер, как знак к переносу, но сама изначальная строка при этом остаётся целой:

$str = "Вася<br />Маша<br />Петя" — это одна строка и переносить её будет только браузер.

$str = "Вася\nМаша\nПетя" — а это уже переносить будет не только браузер, но и всё, где бы мы ни выводили эту строку.

Чтобы было понятно, напиши так:

<?php

echo("Вася<br />Маша<br />Петя<br \>");
echo("---------------------------------");
echo("\nВася\nМаша\nПетя");

?>

Запусти и открой в браузере "посмотреть исходный код".

с \n там слова сами перенесутся на новую строку, а с <br> останутся на одной

kilogram 18.04.2012 02:07

Вижу прикол один, если написать так:

echo("\nВася\nМаша\nПетя");


Выведет просто в одну строку: Вася Петя Маша
Но если написать так:
echo("<pre>\nВася\nМаша\nПетя</pre>");

Каждое слово выведет с другой строки.
Получается значит если внутри тега встречается вот такой выражение: "\n" сам тег PRE переводить слово на другую букву.

T-sh 18.04.2012 02:14

Цитата:

Сообщение от kilogram (Сообщение 169666)
Вижу прикол один, если написать так:

echo("\nВася\nМаша\nПетя");


Выведет просто в одну строку: Вася Петя Маша
Но если написать так:
echo("<pre>\nВася\nМаша\nПетя</pre>");

Каждое слово выведет с другой строки.
Получается значит если внутри тега встречается вот такой выражение: "\n" сам тег PRE переводить слово на другую букву.

нет, это я просто ступил :) тег нужен, но не обязательно <pre> — любой.

без тегов браузер и \n не будет воспринимать, ибо всё, что к нему идёт — если нет тегов, воспринимается одной неразрывной строкой.

kilogram 18.04.2012 02:20

Цитата:

Сообщение от T-sh
тег нужен, но не обязательно <pre> — любой.

Как любой? Если написать так:
echo("<b>\nВася\nМаша\nПетя</b>");

или
echo("<p>\nВася\nМаша\nПетя</p>");

или
echo("<tt>\nВася\nМаша\nПетя</tt>");

перевод на другую строку не сработает, а с PRE пашет.
Вот загадочный этот PRE

T-sh 18.04.2012 02:27

Цитата:

Сообщение от kilogram (Сообщение 169669)
Как любой? Если написать так:
echo("<b>\nВася\nМаша\nПетя</b>");

или
echo("<p>\nВася\nМаша\nПетя</p>");

или
echo("<tt>\nВася\nМаша\nПетя</tt>");

перевод на другую строку не сработает, а с PRE пашет.
Вот загадочный этот PRE

да.. странно.. предварительное форматирование только в теге <pre> работает..

значит вот оно и ещё одно отличие :) извиняюсь. что ввёл в заблуждение.


Часовой пояс GMT +3, время: 16:40.