【问题标题】:Problems with Textareas, New Lines and nl2br文本区域、新行和 nl2br 的问题
【发布时间】:2025-12-16 00:15:01
【问题描述】:

我无法从数据库中获取数据并在 HTML 页面文本区域中回显。

这是用于将数据导入数据库的代码:

$_SESSION['content'] = mysqli_real_escape_string($link, strip_tags($_POST['content'],'<a>'));

这只是去除了 HTML 标记,除了数据库中的链接和存储。如果您查看数据库,换行符是不可见的,但在那里,所以我假设它们是 \n 和 \r。

如果我要输入文本区域:

This should be a 

New line

数据库将其存储为:

This should be a<br>
New line

当回显到文本区域时,会显示以下内容:

This should be a \r\n\r\nNew line

我确定我遗漏了一些非常简单的东西,非常感谢任何帮助。

更新:

如果我删除 mysqli_real_escape_string,换行符会被保留并且可以正常工作,我是否必须为此牺牲安全性?

已解决:

mysqli_real_escape_string 导致问题,不要回显已应用此功能的变量。仅在从数据库中插入、删除等时使用 mysqli_real_escape_string,而不是之前,绝对不是之后;)

谢谢大家!

【问题讨论】:

  • 尝试在您发布的行之前使用$_POST['content'] = stripslashes($_POST['content'])。但是我不确定这会有所帮助...php.net/manual/en/function.stripslashes.php
  • 当然这只会去掉换行符,使 \n -> n?
  • @user964145 如果在数据库中存储为 \\\n (转义斜杠),则不会
  • 我不知道。必须调用该函数来清除转义字符串。不使用它,例如,如果您在表单中输入 I don't know,您将在 POST 数据中获得 I don\'t know
  • @lorenzo-s,这是正确的,但它也会逃脱 \\\n

标签: php mysql nl2br


【解决方案1】:

使用正确的 HTML/CSS。

;-)

换行符在 HTML pre 标记或 CSS white-space 属性设置为的标记中的所有工作:

white-space: pre;

资源:

http://www.w3schools.com/cssref/pr_text_white-space.asp

http://www.quirksmode.org/css/whitespace.html

【讨论】:

    【解决方案2】:

    首先,您不应该使用 nl2br,因为这会将您的 \n 更改为 &lt;br&gt;

    您很可能需要去掉斜线echo stripslashes($_SESSION['content'])

    编辑以下进一步的 cmets:

    如果数据在数据库中以&lt;br&gt; 的形式存储,您只需执行str_replace('&lt;br&gt;',"\n",$string); 即可将&lt;br&gt; 转换为\n

    【讨论】:

    • 这使得 \n 和 \r 变成了 n 和 r。我想在文本框中准确地回显我写的内容,保留换行符
    • 非常抱歉,刚刚发现换行符在数据库中存储为
      ,我可以将这些
      标签转换为 textarea 的新行吗?
    • @user964145 你能告诉我们存储在数据库中的数据吗?
    • 函数 br2nl( $data ) { return preg_replace( '!!iU', "\n", $data ); }
    • 这对我仍然不起作用,使用 str_replace 和 Richard 提供的函数,仍然在 textarea 中输出 'This is a\r\n\r\nnew line',mysqli_real_escape_string 可以造成问题?
    【解决方案3】:

    这对我有用:

    function br2nl( $input ) {
        return preg_replace( '/\<br.*\>/Ui', '', $input );
    }
    

    【讨论】:

      【解决方案4】:

      对于很长的行,您还需要将文本换行,而不是可能脱离其父容器。要涵盖这种情况,但也要保留新行,请使用以下 css:

      white-space: pre-wrap;
      

      资源:https://css-tricks.com/almanac/properties/w/whitespace/

      【讨论】:

        【解决方案5】:

        nl2br 函数将该内容作为字符串处理: http://codepad.org/M2Jw9KQJ

        这让我相信你并没有重复你声称的内容。

        您确定数据库中的内容与您所说的一样吗? 也许你需要反过来:

        function br2nl( $data ) {return preg_replace( "!!iU", "\n", $data );}

        【讨论】:

        • 当内容被提交时,mysqli_real_escape_string 和 strip_tags 被应用到它上面。在数据库中,新行表示为
          标记。然后将修改后的内容回显到 textarea 中,没有新行,而只是 \n\r 的尾迹,例如 'This is a\r\n\r\nnew line'