【问题标题】:nl2br not working for menl2br 不适合我
【发布时间】:2010-08-17 02:35:38
【问题描述】:

从我的数据库中获取数据后,我无法让nl2br 函数工作:

$result = mysql_query("SELECT comments..etc.etc..");

while ($row = mysql_fetch_array($result))
{
  echo nl2br($row["comments"]);
}

在数据库行comments:

\r\nThanks,\r\n

输出:

与 DB 相同:

\r\nThanks,\r\n

如果我像这样简单地测试一下,它可以正常工作:

<?php
$mystring = "\r\nThanks,\r\n";
echo nl2br($mystring);
?>

输出:

converts \r \n to <br />

【问题讨论】:

  • 为了让您理解,您的工作示例不要将 \r\n 转换为 &lt;br&gt; 标记。但它分两步进行:双引号字符串将 \r\n 序列转换为换行符、回车符,然后 nl2br() 函数将这个标签添加到它们(保持这些符号不变)。如果您将echo $mystring; 添加到您的代码中,您将看不到 \r\n\ 打印

标签: php


【解决方案1】:

试试这个:

echo preg_replace('/\v+|\\\r\\\n/Ui','<br/>',$row["comments"]);

【讨论】:

  • 优秀的方法。然后另一个以纯文本形式输出。我不敢相信周围有太多思想直接的人,他们无法远离他们所阅读的内容。 “按照它的措辞回答问题,永远不要考虑它的背景” - 一个真正的座右铭。不管答案是否真的是一种伤害。
  • 我建议先替换 \v+|\\\r\\\n 以获取这些行尾(Mac/大多数 Unix),然后将剩余的 \\\n 替换为剩余的行尾。您列出的正则表达式将为 Mac/大多数 Unix 插入双倍的换行符。否则,这回答了 sebb 的问题。
  • 我把这个改成 preg_replace('/\v+|\\\r\\\n/','
    ', $string),我得到了双
    s
  • @netadictos 是对的,最好使用他的代码(仍然可以编辑你的答案?)
【解决方案2】:

我知道这是一篇旧帖子,但如果您像我一样偶然发现了这个问题并且上述方法对您不起作用,那么这个解决方案可能会对您有所帮助:

echo nl2br(stripslashes($row["comments"]));

(它们不是同一个函数,注意strip后附加的“c”)

echo nl2br(stripcslashes($row["comments"]));

查看对我有帮助的原始帖子:nl2br() not working when displaying SQL results

【讨论】:

  • 感谢发帖。在我第一次调用 stripcslashes 之前,我发现 nl2br 在 PHP 脚本(也不是 Smarty 模板)中不适合我。
【解决方案3】:

在将数据添加到数据库时,您很可能会进行两次转义。
检查将数据添加到数据库的代码并删除不必要的转义。

很可能是一些毫无意义的“通用消毒”功能。

这很容易。
让我们引用一个引号,而不是换行符来演示。行为相同。 斜线被剥离,然后数据进入数据库。

因此,在正常情况下:

来源:It's
转义后:It\'s
通过查询执行斜线被剥离和
在数据库中和返回It's

在双重转义情况下:

来源:It's
转义后:It\'s
第二次转义后:It\\\'s
通过查询执行斜线被剥离和
在数据库中和返回It\'s
我们的数据被破坏了。

只要让自己明白,转义不是什么神奇的东西,可以让你的数据“安全”(因此可以多次执行,正如您可能认为的那样)。它只是为某些符号添加反斜杠。

【讨论】:

  • 你没有回答这个问题。也许他无法控制数据如何进入他的数据库?不管怎样,它现在就在那里。修复无意义地清理他的数据的代码对他的问题无济于事。
  • 这很简单,伙计。不是每个问题都值得回答。
  • Sharpnel 嗨,谢谢你的提示,你在我的代码中是对的,我无意中进行了两次转义,我试图理解,当你两次转义时会发生什么过程?你能告诉我,让我了解当你两次逃跑时数据会发生什么?谢谢
【解决方案4】:

我的猜测是数据库中的斜杠是文字斜杠(后跟 n 或 r),而不是换行符。你能找到一种在数据库中存储文字换行符的方法吗?

【讨论】:

    【解决方案5】:

    以下解决方案适用于 windows 以及 linux/unix 机器

    str_replace(array("\\r\\n", "\\r", "\\n"), "&lt;br /&gt;", "string");

    【讨论】:

      【解决方案6】:

      确保您不要使用文件中的字符串和/或设置在单个撇号中。因为字符串是按字面处理的,而 nl2br 将不起作用。 NL2BR 可以使用双撇号。

      【讨论】:

        【解决方案7】:

        根据 Christian 所说的,你为什么不尝试用 "\r\n" 替换文字 '\r\n'

        【讨论】:

        • 因为它必须是死的所以要治愈,而不是症状。
        【解决方案8】:

        您存储的数据已添加斜线。

        你必须先使用 stripslashes() 然后 str_replace()

        stripslashes(str_replace('\r\n','<br/>',$row["comments"]))
        

        【讨论】:

          【解决方案9】:

          由于某种原因,这对我不起作用...

          echo nl2br(stripcslashes($row["comments"]));
          

          但这确实...

          $comments = stripcslashes($row["comments"]);
          
          $commentsWithBreaks = nl2br($comments);
          
          echo $commentsWithBreaks;
          

          【讨论】:

            【解决方案10】:

            也不适合我。我刚刚做了以下事情:

            $mensaje = str_replace("&amp;#10;", "&lt;br/&gt;", $mensaje);

            【讨论】:

              【解决方案11】:

              我能够使用此代码将换行符替换为&lt;br&gt;

              str_replace(array("\r\n", "\r", "\n"), "<br>", "input");
              

              (Windows 机器)

              【讨论】:

                【解决方案12】:

                这可能是一个解决方案,至少对我来说是这样。

                $message = str_replace("\\r\\n", "<br>", $message);
                

                您可能会得到一个字符串,其中斜杠被转义(即 \\)并且nl2br 与 \n\r 而非 \\n\\r

                一起使用

                一旦你明白了这一点,解决方案就很简单了:)

                【讨论】:

                  猜你喜欢
                  • 2013-11-30
                  • 1970-01-01
                  • 2013-10-23
                  • 2012-07-20
                  • 2011-08-11
                  • 2011-01-05
                  • 2011-12-23
                  • 2012-04-01
                  • 2011-05-02
                  相关资源
                  最近更新 更多