将换行符/回车作为隐藏字段值发布

11

我需要通过隐藏域来发布多行数据。发布后,这些数据将在文本区域中查看。如何在HTML表单中发布新的一行或回车符?

我尝试过使用 \r\n,但只会将实际的 "\r\n" 数据发布出去。

<input type="hidden" name="multiline_data" value="line one\r\nline two" />

有没有一种方法可以做到这一点?

4个回答

13

不要使用

<input type="hidden">

尝试使用

<textarea style="visibility:hidden;position:absolute;">


1
style="display:none;" 可能更加简洁。 - daiscog
3
表单元素设置为 display:none 的话,不一定会被提交。我不确定哪些浏览器会或不会提交 display:none 字段,但根据该回答下面的评论,IE8 不会提交。 - 0b10011

9
虽然在hidden状态中技术上允许使用换行符(回车和换行符),但为了与旧版浏览器兼容,应该对其进行转义。您可以通过将所有回车符(\u000D\r)和所有换行符(\u000A\n)替换为专有字符串来实现此目的,在原始字符串中也要进行转义以识别为回车符或换行符。

仅使用字符实体在这里无效,因为不符合规范的浏览器可能知道&#10;&#13;是换行符,并从值中剥离它们。

示例

例如,在PHP中,如果要将传递的值echo到文本区域中,则应包含换行符(和未转义的字符串)。

<textarea>Some text with a \ included
and a new line with \r\n as submitted value</textarea>

然而,在PHP中,如果您要将值输出到标签的value属性中,您需要使用专有的字符串(例如\r\n)对新行进行转义,并转义提交的值 中任何实例的专有字符串。

<input type="hidden" value="Some text with a \\ included\r\nand a new line\\r\\n as submitted value">

然后,在将该值用于其他地方之前(插入到数据库、发送电子邮件等),请务必解除提交的值的转义,如有必要。

保障

为了进一步保证,我向WHATWG提出了问题,HTML规范的编辑Ian Hickson回复:

bfrohs 关于 <input type=hidden> 的问题--在 value 中是否允许换行和回车?在 Text 状态和 Search 状态中明确禁止使用它们,但是在 Hidden 状态中没有提到。如果不允许,有没有可接受的 HTML 解决方案来存储来自文本区域的表单数据? Hixie 是的,它们是允许的 // 如我所记 // 由于一些浏览器会将其标准化,基于向后兼容的原因,您可能希望对它们进行转义 // 我忘记我们是否修复了这个问题 // 在规范中 来源

5

实际上取决于字符集,但是&#10;应该表示换行,而&#13;应该表示回车符。您应该能够在value属性中使用这些。


如果浏览器支持表单提交,它很可能也会意识到 &#10;&#13; 是换行符,如果它错误地删除了换行符,那么它也会删除所有出现的 &#10;&#13; - 0b10011

2
你没有说明这是用于什么或使用的技术,但你需要知道不能信任隐藏字段的value="line one line two"保持不变,因为恶意用户可以在它被发送回POST之前篡改它。由于你稍后将该值放入<textarea>中,所以你肯定会受到跨站点脚本攻击的影响,除非在输出之前验证和/或清理"multiline_data"字段内容。

当向隐藏字段写入值并读取它时,通常最好将它保留在服务器上,作为会话、页面流或其他环境提供的属性来执行此类操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接