如何在html textarea POST数据中保留换行符

Posted

技术标签:

【中文标题】如何在html textarea POST数据中保留换行符【英文标题】:How to keep linebreaks in html textarea POST data 【发布时间】:2019-07-26 09:43:56 【问题描述】:

我正在尝试将歌曲的歌词提交到文本区域。所以,这需要在我输出时保持换行符。我知道浏览器标准应该使用\r\n 作为换行符,并且php 的nl2br() 函数可以将\r\n 转换为<br>tags。

我也知道 textarea 输入需要 wrap="hard" 才能通过换行符,否则默认的 wrap="soft" 将被忽略,并且 cols="" 必须指定时使用 wrap="hard"。我试图用下面的 html 来完成这个:

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

但是,POST 数组不显示任何换行符。我将它输入到文本区域:

歌词的第一行

输入到文本区域

让我失望了

红眼睛、火和迹象

因为换行符不在 POST 数据中

我想做一缕阳光,永远不离开家

我在 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)。但是,我似乎什至无法使该示例起作用。当我在 textarea 中输入许多换行符时,文本出来时没有\r\n

我在这里错过了什么?

【问题讨论】:

看看***.com/questions/498461/… 我读过,但这只是相同的一般规则。我什至无法通过 '\r\n' 将数据发送到服务器。如果我有一个 textarea 并在表单中使用 wrap="hard" 并使用 POST,那么 POST 元素不应该在字符串中包含 '\r\n' 吗?我的字符串没有\r\n。 【参考方案1】:

关于wrap 属性,您不需要它来实现您想要实现的目标。如HTML 5.2 specification 中所述,使用softhard 属性选项时,文本中的换行符会被保留。

hard 选项仅在您想要限制输入的每行长度时才需要。使用此选项可在输入自然换行的任何位置强制附加换行符(即,无论何时该行长于cols 中设置的值)。

例如,如果我有一个设置为 cols="20" wrap="hard" 的 textarea 并且我输入了文本:

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 选项捕获。

关于提交的文本,请注意转义字符\r\n 不会在发布的值中看到,换行符仍然是与您点击时相同的解释形式键盘上的“输入”键。

即使您看不到转义字符,但换行符确实存在并且仍然可以被 PHP 找到和操作。正如您所建议的,nl2br 可用于将新行转换为 HTML 中断元素。

如果您确实需要将换行符转换为相应的转义字符,可能在存储值之前,那么有多种方法可以操作字符串。举几个例子:

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

(为了进一步阅读,有一个关于double/single quotes and interpreting newlines 的有用 S.O. 答案)

最后,您目前如何查看$_POST 的内容?如果您将var_dump 的内容直接输出到HTML 中,那么您需要将输出包装在&lt;pre&gt;&lt;/pre&gt; 标记中,以便查看生成的HTML 中的换行符。更好的是,输出到日志文件,这样您就无需考虑此类渲染问题。

【讨论】:

这是一个很好的解释。现在我完全理解了“硬”和“软”属性,以及如何在浏览器 DOM 中解释换行符以及如何存储或转换数据。 另外,感谢您对 HTML 5 规范的喜欢。【参考方案2】:

可以将 textarea 文本作为查询字符串的一部分传递。这将强制将整个字符串进行 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/

我想您也可以在 POSTING 之前对 textarea 文本进行 urlencode() 并在另一端对其进行 urldecode。

【讨论】:

【参考方案3】:

这是最终解决问题的方法:在输出或存储到数据库之前,我在字符串上使用了 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);

【讨论】:

以上是关于如何在html textarea POST数据中保留换行符的主要内容,如果未能解决你的问题,请参考以下文章

如何在html textarea POST数据中保留换行符

如何使用 POST 检索 <textarea> 值并保存到文件中?

如何在textarea文本输入区内实现换行

html textarea通过python使用post函数

如何在 HTML 选择选项列表中保留空间<option value='hi this'>hi</option>

如何将textarea值作为单独的变量?