文本框中的换行符

44
我知道在保存文本区域时,可以使用nl2br()或str_replace将/n更改为br标签等。然而,我不确定如何在文本区域中插入换行符。我似乎找不到关于如何将数据带回文本区域并保留这些换行符的信息。
例如,我有一个表单,用户可以更新字段。因此,用户可能输入:
foo
bar
baz

当保存到数据库时,它将保存为:

foo<br />bar<br />baz<br />

现在,当用户通过页面刷新返回表单时,所有字段都会自动填充以前的数据,从数据库中获取数据。

然而,文本区域将br标签显示为文本,而不是添加换行符。我还尝试将br标签更改为/n,希望文本区域会将它们解释为换行符,但没有成功。除此之外,我还尝试了转义等操作。

所以我的问题是:这可以做到吗?或者更重要的是,可以使用HTML/PHP(我正在使用smarty)来完成吗?如果不可能,可以使用JavaScript完成吗?

如果有示例,将不胜感激。

感谢阅读。

13个回答

74

保存到数据库时不要进行 nl2br 转换,只有在 HTML 显示文本时才需要进行 nl2br 转换。强烈建议不要在数据库中存储任何 HTML 格式(除非您也使用了丰富的 HTML 编辑器,否则这样做是愚蠢的)。

换行符 \n 只会在文本区域中成为换行符。


感谢大家的回复。我现在明白最好不要在将HTML添加到数据库中,而是在需要时在输出时应用:) 谢谢! - fl3x7
@fl3x7 嗯,不要忘记你必须在进入时进行安全处理 :) - vdegenne
@Oddantfr 同意 :) 我已经养成了一个包含文件的习惯,它涵盖了所有与页面相关的预处理。因此,在执行任何与页面相关的 PHP 之前,所有 POST 和 GET 值都会被清理。 - fl3x7
11
需要翻译的内容:One thing to point out is to use \n between " (double quotes) instead of ' (single quotes). Otherwise it won't work. Like this: "\n"请使用双引号"而不是单引号'来在文本中使用\n进行换行,否则它将无法正常工作。示例:"\n" - Rens Tillmann

32
你可以使用str_replace<br />标签替换为换行符。
str_replace('<br />', PHP_EOL, $textarea);

或者,您可以在不先调用 nl2br 的情况下将数据保存在数据库中。这样换行符就会保留下来。在显示为HTML时,调用nl2br。这种方法的另一个好处是,在数据库中需要更少的存储空间,因为换行符是1个字符,而不是6个字符的 "<br />"。


1
当然,如果您正在对显示进行替换而不是保存到数据库(我认为这样做肯定更好),那么代码将是str_replace(PHP_EOL, '<br />', $textarea); ... 或者只需使用nl2br($textarea) ... - squarecandy

25
啊,这真的很简单。 只需添加

white-space:pre-wrap;

针对你要显示的元素的css。

我的意思是,如果你正在使用<p>来显示结果,则你的css应该是:

p{
   white-space:pre-wrap;
}

1
只有在您将数据插入到文本区域并在其他元素(在前端)中显示它时,此方法才有效。 - Nizam Kazi
如果您希望它与<pre>标签完全相同(除了换行符之外不进行任何包装),那么您可以使用p { white-space: pre; } - Aidin

7
您可以使用以下代码:
$course_description = nl2br($_POST["course_description"]);
$course_description = trim($course_description);

7

这里发布了一些错误的答案。他们把\n替换成了<br />,实际上应该把<br />替换成\n

下面是一个好的答案,可以在你输入文本框时将<br />存储到mysql中:

str_replace("\n", '<br />',  $textarea);

3
我的建议是将数据保存到数据库中时使用换行符,而不是在解析时使用nl2br函数。您应该在输出中使用nl2br函数,而不是在输入中使用它。
对于您的问题,您可以使用PHP或JavaScript:
PHP:
str_replace('<br />', "\n", $textarea);

jQuery:

$('#myTextArea').val($('#myTextArea').val().replace(@<br />@, "\N"));

1

PHP方面:从文本区字符串到PHP字符串

$newList = ereg_replace( "\n",'|', $_POST['theTextareaContents']);

PHP端:将PHP字符串转换为文本区域字符串:

$list = str_replace('|', '&#13;&#10;', $r['db_field_name']);

1
我发现在表格中有效的方法是使用str_replace('&lt;br&gt;', PHP_EOL, $textarea)。

这对我的目的很有效,而且非常简单和灵活。 - John Contarino

1

这对我有效。

 str_replace(array("\r", "\n"), '&#10;', $textareavalue);

1

简单的方法:

  1. Use this to insert into mysql:

    $msg = $_GET['msgtextarea']; //or POST and my <strong>msg</strong> field format: text
    $msg = <strong><em>htmlspecialchars</em></strong>($msg, ENT_QUOTES);

  2. And use this for output:

    echo <strong><em>nl2br</em></strong>($br['msg']);


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