Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在html文本区域POST数据中保留换行符_Php_Html_Forms_Textarea_Line Breaks - Fatal编程技术网

Php 如何在html文本区域POST数据中保留换行符

Php 如何在html文本区域POST数据中保留换行符,php,html,forms,textarea,line-breaks,Php,Html,Forms,Textarea,Line Breaks,我正在尝试将歌曲的歌词提交到文本区域。所以,这需要在我输出时保持换行。我知道标准浏览器应该使用\r\n作为换行符,PHP的nl2br()函数可以将\r\n转换为标记 我还知道,textarea输入需要wrap=“hard”才能通过换行符,否则默认的wrap=“soft”将被忽略,并且在使用wrap=“hard”时必须指定cols=”“。我已尝试使用下面的html来实现这一点: <textarea wrap="hard" name="reading_text" cols="450" rows

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

标记

我还知道,textarea输入需要wrap=“hard”才能通过换行符,否则默认的wrap=“soft”将被忽略,并且在使用wrap=“hard”时必须指定cols=”“。我已尝试使用下面的html来实现这一点:

<textarea wrap="hard" name="reading_text" cols="450" rows="6" maxlength="5000"></textarea>
为了让我更困惑,我试着看W3学校的演示()。然而,我似乎连这个例子都做不到。当我在文本区域中输入许多换行符时,文本出来时没有
\r\n

我在这里遗漏了什么?

您可以将文本区域文本作为查询字符串的一部分传递。这将强制对整个字符串进行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()
对接收页面上的字符串进行解码。这将保留格式并正确显示


我想您也可以在发布之前对textarea文本进行urlencode()编码,并在另一端对其进行urldecode

关于
wrap
属性
,您不需要它来实现您想要实现的目标。如中所述,使用
soft
hard
属性选项时,将保留文本中的换行符

只有当您想限制输入的每行长度时,才需要
选项。使用此选项可以在输入自然换行的地方强制额外换行(即,换行长度超过在
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
如果我理解正确,您只想保留用户有意输入的换行符;这些将使用默认的
选项捕获

关于提交的文本,请注意,转义字符
\r\n
将不会出现在发布的值中,换行符的解释形式仍然与您在键盘上按“enter”键时的解释形式相同

尽管您看不到转义字符,但换行符确实存在,并且仍然可以被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']);
(为了进一步阅读,这里有一个有用的s.O.答案)


最后,您当前如何查看
$\u POST
的内容?如果要将
var_dump
的内容直接输出到HTML中,则需要将输出包装在
标记中,以便查看结果HTML中的换行符。更好的是,输出到日志文件,这样您就不必考虑这些渲染问题。

< P>这里是最后解决的问题:在字符串输出或存储到数据库之前,我使用PHP的过滤器<代码> FieldFractStrutsLoop[()],您将删除换行符<代码> \r\n < < /P>
$input = filter_var($input, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_LOW);
要解决此问题,您可以使用
FILTER\u FLAG\u ENCODE\u LOW
而不是
FILTER\u FLAG\u STRIP\u LOW


看一看,我读到了,但它只是相同的一般规则。我甚至无法将包含“\r\n”的数据获取到服务器。如果我有一个textarea,在表单中使用wrap=“hard”并使用POST,那么POST元素的字符串中不应该有“\r\n”吗?我的字符串没有\r\n。这是一个很好的解释。现在我完全理解了“硬”和“软”属性,以及在浏览器DOM中如何解释换行符以及如何存储或转换数据。另外,感谢您对HTML5规范的支持。
$input = filter_var($input, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_LOW);