azorr
@azorr
программирую по мере возможности..

Как вывести текст в textarea не потеряв переносы строк в тексте?

Нужно вывести текст в textarea из SQL, не потеряв при этом переносы в тексте.
Что делал:
ВАРИАНТ 1-Й


1 - пишу абзац текста с переносами в textarea

Мама мыла
раму чисто
и быстро!


2 - Отправляю в SQL-базу

3 - Читаю из SQL-базы обратно в textarea

И имею ошибку в консоли:

Uncaught SyntaxError: '' string literal contains an unescaped line break

Скриншот фрагмента кода удален модератором.

Зато абзац текста выводится в textarea как надо, с переносами

Мама мыла
раму чисто
и быстро!


Вариант с красной ошибкой в консоли конечно НЕ вариант

ВАРИАНТ 2-Й

1 - Заново набираю абзац текста в textarea с переносами

Мама мыла
раму чисто
и быстро!


2 - Меняю спец-символы переноса \n \r на HTML-сущности

вот так:

$var_zametka = addslashes($var_zametka);

2 - Отправляю в SQL-базу

3 - Читаю из SQL-базы обратно в textarea

НЕТ ошибки в консоли:
Но, абзац текста выводится в textarea с недостатками:

- переносы исчезли
- текст выводится с html-сущностями
- и еще слитной колбасой..

Мама мыла\r\nраму чисто\r\nи быстро!

Переносы утрачены

>можно тут почистить эти сущности \n\r, но будут только пробелы вместо переносов..

Разные очистки пробовал:

$var_zametka = str_replace ('\r\n', '\n', $var_zametka);

$var_zametka = nl2br(htmlspecialchars($var_zametka));

$var_zametka = html_entity_decode($var_zametka);

$var_zametka = html_entity_decode($var_zametka, ENT_QUOTES | ENT_HTML5, 'UTF-8');


ВАРИАНТ 3-Й
1 - пишу абзац текста с переносами в textarea

Мама мыла
раму чисто
и быстро!


2 - Отправляю в SQL-базу НЕ МЕНЯЯ на HTML-сущности

3 - Оригинальные системные переносы сохраняются в SQL - базе

4 - лезу руками в SQL-базу, меняю

«Переносы как в Windows»

6337650022e4f644027924.jpeg

на
«Переносы как в Unix»

633765190c6ed389778996.jpeg

5 - Читаю из SQL-базы обратно в textarea

НЕТ ошибки в консоли:

Абзац текста выводится в textarea так:

Мама мыла‧раму чисто‧и быстро!

- вместо переносов — точки!
- и опять слитной колбасой..
- ну и руками в SQL лазить как бы вообще не надо это чтоб понять механику..

  • Вопрос задан
  • 866 просмотров
Пригласить эксперта
Ответы на вопрос 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
ВАРИАНТ 4-Й, очевидный
1 - пишу абзац текста с переносами в textarea
2 - Отправляю в SQL-базу ничего не меняя.
3 - Оригинальные системные переносы сохраняются в SQL - базе, как и должны, поскольку любые заморочки с яваскриптами к базе данных не имеют вообще никакого, ни малейшего отношения
4 - Читаю из SQL базы
5 - Вывожу в обратно в texarea
6 - В texarea ВСЁ РАБОТАЕТ! A magic! При том что мы вообще нигде ничего ни на что не меняли

6a - По поводу HTML сущностей. Хотя в приведённом примере нет ни одного символа, который бы требовал перекодирования в HTML-сущности, тем не менее, при выводе любого текста в HTML, эти сущности действительно должны быть перекодированы в обязательном порядке, всегда, в 100% случаев. Причем с помощью не какой-то левой addslashes, а функции, которая действительно это делает, htmlspecialchars($var_zametka)

7 - Собираюсь с мыслями, и напряжённо думаю - в каком месте у меня текст взаимодействует с яваскриптом? Который к выводу текста в текстарию не имеет ни малейшего отношения?
8 - думаю...
9 - думаю...
10 - наконец-то нахожу.
11 - перед тем, как отправлять текст в яваскрипт, кодируем его тем методом, который специально предназначен для отправки данных в яваскрипт, а не какими-то шаманскими заклинаниями и плясками с бубном.echo json_encode($var_zametka)
12 - ВСЁ РАБОТАЕТ! Просто потому, что получилось расхлебать кашу в голове, в которой SQL путается с РНР, HTML c яваскриптом, а экранирование спецсимволов почему-то называется заменой на HTML-сущности. Хотя если открыть документацию на абсолютно бесполезную функцию addslashes, то там ни одного разочка слово HTML не встретится.
Ответ написан
Нагородили, просто ппц :)
А применить к textarea правило CSS не пробовали?
white-space: pre-line;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы