Как сохранить разрывы строк в html текстовых данных POST - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь добавить текст песни в текстовую область.Таким образом, это должно сохранить разрывы строк при выводе.Мне известно о том, что стандарт браузеров должен использовать \r\n в качестве переноса строки, а функция PHP nl2br () может конвертировать \r\n в теги <br>.

Мне также известен тот факт, что для ввода текстовой области требуется wrap = "hard", чтобы пропустить разрывы строк, в противном случае значение по умолчанию wrap = "soft" будет игнорироваться, и что cols = "" долженуказывать при использовании wrap = "hard".Я попытался сделать это с помощью HTML ниже:

<textarea wrap="hard" name="reading_text" cols="450" rows="6" maxlength="5000"></textarea>

Однако массив POST не показывает разрывов строк.Я ввожу это в текстовое поле:

Первая строка текста

Это было введено в текстовое поле

Увы, к моему ужасу

Красныйглаза, огонь и знаки

Поскольку разрывы строк не указаны в данных POST

Я хочу сделать луч солнца и никогда не выходить из дома

Iполучите это в массиве POST:

array(5) { ["reading_text"]=> string(216) "Line one of the lyrics That were entered into the textarea Alas to my dismay Red eyes and fire and signs Because the line-breaks are not in the POST data" ["add_reading"]=> string(3) "Add" }

Чтобы еще больше сбить меня с толку, я попытался взглянуть на демонстрацию W3 Schools (https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_textarea_wrap). Однако, похоже, я даже не могу заставить этот пример работать.Когда я вписываю много разрывов строк в текстовое поле, текст выводится без \r\n.

Что мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

Что касается атрибута wrap , он вам не нужен для того, чего вы пытаетесь достичь.Как описано в спецификации HTML 5.2 , разрывы строк в тексте сохраняются при использовании либо атрибутов soft или hard.

Опция hard требуется только в том случае, если вы хотите limit длина каждой строки ввода.Используйте эту опцию, чтобы принудительно вводить дополнительные разрывы строк везде, где ваш ввод естественным образом переносится (т. Е. Там, где строка длиннее значения, установленного в cols).

Например, если у меня есть текстовая область, установленная на cols="20" wrap="hard", и я ввожу текст:

This is a long string that will exceed the number of cols in this textarea

Тогда отправленное значение станет:

This is a long
string that will
exceed the number of
cols in this
textarea

Если я правильно понял, вы хотите сохранить только те разрывы строк, которые были намеренно введены пользователем;они будут записаны с использованием опции soft по умолчанию.

Что касается отправленного текста , обратите внимание, что escape-символы \r\n не будут отображаться в опубликованном значении, символы новой строкинаходятся в той же интерпретируемой форме, в которой они находились, когда вы нажимали клавишу «enter» на клавиатуре.

Даже если вы не можете видеть escape-символы, символы новой строки все же существуют и могут быть найдены и обработаныPHP.Как вы предложили, nl2br может использоваться для преобразования новых строк в элементы HTML-разрыва.

Если вам действительно нужно преобразовать символы новой строки в соответствующие им escape-символы, возможно, перед сохранением значения, существует несколько способов манипулирования строкой.Несколько примеров:

$escaped_newlines = str_replace("\r\n", '\r\n', $_POST['reading_text']);
$escaped_newlines = preg_replace('/\r\n/', '\r\n', $_POST['reading_text']);

(Для дальнейшего чтения есть полезный ответ SO о двойных / одинарных кавычках и интерпретации новых строк )

Наконец, как вы в настоящее время?просмотр содержимого $_POST?Если вы выводите содержимое var_dump непосредственно в HTML, то вам нужно будет обернуть вывод в теги , чтобы увидеть разрывы строк в результирующем HTML.Более того, вывод в файл журнала, так что вам не нужно учитывать такие проблемы рендеринга.

0 голосов
/ 09 марта 2019

Если вы используете PHP-фильтр FILTER_FLAG_STRIP_LOW (http://php.net/manual/en/filter.filters.flags.php) в строке перед выводом или сохранением в базе данных, вы удалите символы новой строки \r\n.

Чтобы устранить эту проблемуВы можете использовать FILTER_FLAG_ENCODE_LOW вместо FILTER_FLAG_STRIP_LOW как таковое:

$input = filter_var($input, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_LOW);
0 голосов
/ 05 марта 2019

Вы можете передать текстовое поле как часть строки запроса.Это приведет к тому, что вся строка будет закодирована в URL следующим образом:

%0AGray%2C%20quiet%20and%20tired%20and%20mean%0A%0APicking%20at%20a%20worried%20seam%0A%0AI%20try%20to%20make%20you%20mad%20at%20me%20over%20the%20phone.%0A%0ARed%20eyes%20and%20fire%20and%20signs%0A%0AI%27m%20taken%20by%20a%20nursery%20rhyme%0A%0AI%20want%20to%20make%20a%20ray%20of%20sunshine%20and%20never%20leave%20home%0A

, а затем просто декодируйте строку на принимающей странице с помощью urldecode().Это должно сохранить форматирование и отобразить его правильно.

http://php.net/manual/en/function.urldecode.php

https://www.tools4noobs.com/online_php_functions/urldecode/

Я полагаю, вы могли бы просто также urlencode () текст текстовой области перед POSTING и urldecode его на другом конце.

...