如何在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 中所述,使用soft
或hard
属性选项时,文本中的换行符会被保留。
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 中,那么您需要将输出包装在<pre></pre>
标记中,以便查看生成的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数据中保留换行符的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 POST 检索 <textarea> 值并保存到文件中?