Php nl2br()创建额外的新行

Php nl2br()创建额外的新行,php,mysql,Php,Mysql,我正在尝试向数据库中插入说明文本字段 我以前只是在做这样的事情: $group_description = mysql_real_escape_string($_POST['group_description']); $group_description = mysql_real_escape_string(nl2br($_POST['group_description'])); 但这会产生问题,因为当我从数据库中取出内容时,它们会显示为\n\r字符串而不是新行 以下是出现该问题的页面示例:

我正在尝试向数据库中插入说明文本字段

我以前只是在做这样的事情:

$group_description = mysql_real_escape_string($_POST['group_description']);
$group_description = mysql_real_escape_string(nl2br($_POST['group_description']));
但这会产生问题,因为当我从数据库中取出内容时,它们会显示为\n\r字符串而不是新行

以下是出现该问题的页面示例:

所以我尝试通过添加nl2br来修复它,如下所示:

$group_description = mysql_real_escape_string($_POST['group_description']);
$group_description = mysql_real_escape_string(nl2br($_POST['group_description']));
但这只是增加了一行:(以下是当前问题的示例:

下面是我使用的insert语句示例:

$insert_group_sql =  'INSERT INTO hiking_groups( title , group_description ) VALUES ( "'.$group_name.'" , "'.$group_description.'" ) ';
正确的方法是什么

下面是我用来显示$group\u描述的代码

          //Convert all urls to links
          $group_description = preg_replace('#([\s|^])(www)#i', '$1http://$2', $group_description);
          $pattern = '#((http|https|ftp|telnet|news|gopher|file|wais):\/\/[^\s]+)#i';
          $replacement = '<a href="$1" target="_blank">$1</a>';
          $group_description = preg_replace($pattern, $replacement, $group_description);

          $group_description = str_replace("\'" , "'", $group_description );
          $group_description = nl2br($group_description);

          /* Convert all E-mail matches to appropriate HTML links */
          $pattern = '#([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.';
          $pattern .= '[a-wyz][a-z](fo|g|l|m|mes|o|op|pa|ro|seum|t|u|v|z)?)#i';
          $replacement = '<a href="mailto:\\1">\\1</a>';
          $group_description = preg_replace($pattern, $replacement, $group_description);
//将所有URL转换为链接
$group|U description=preg|U replace('#([\s| ^])(www)#i','$1http://$2',$group|U description);
$pattern='#(http | https | ftp | telnet | news | gopher | file | wais):\/\/[^\s]+)#;
$replacement='';
$group\U description=preg\U replace($pattern,$REPLACENT,$group\U description);
$group\U description=str\U replace(“\'”、“'”、$group\U description);
$group_description=nl2br($group_description);
/*将所有电子邮件匹配项转换为适当的HTML链接*/
$pattern='#([0-9a-z]([-.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\;
$pattern.='[a-wyz][a-z](fo | g | l | m | mes | o | op | pa | ro | seum | t | u | v | z)|i';
$replacement='';
$group\U description=preg\U replace($pattern,$REPLACENT,$group\U description);

在通过nl2br之前尝试修剪:

nl2br( trim($_POST['group_description']) )

首先,我建议您按照Spudley的建议做,在数据库中保持原始形式,并在显示后格式化

nl2br()
应该可以工作,因此我建议您检查输入数据,以准确查看输入的内容(如果在将其存储到数据库之前不格式化,则更容易执行此操作)。它所做的是\n、\n\r、\r\n和\r并插入一个

。例如,您应该检查\n和\r之间是否没有空格

另外,请确保只在一个位置使用
nl2br()
,因为它不会替换新行,所以只插入

(也就是说,如果使用
nl2br(nl2br($group_description))
,您将得到两个

更新:

我在附加代码中看到,当您显示描述时,您已经有了一个
nl2br()
。您需要删除其中一个,以便只添加

一次

此外,与此相反:

      $group_description = str_replace("\'" , "'", $group_description );
      $group_description = nl2br($group_description);
试试这个:

      $group_description = stripslashes($group_description);
      $group_description = nl2br($group_description);

这应该会删除mysql\u real\u escape\u string()中的所有消毒有,这应该可以解决文本中显示的问题。

更好的做法是将它们作为换行符存储在数据库中,并且只有在实际将它们输出到浏览器时才转换为

标记。您是否在浏览器中以某种方式从数据库中转出输出?我认为这可能是seing\n\r的原因。数据库中的数据看起来正常吗?例如,当您通过phpMyAdmin查看数据时。@Yasen我发布了用于显示组的代码。@Eriks这没有帮助,因为文本之间有许多新行。不仅仅是在开头和结尾。如果要删除重复的
?例如preg\u replace(“/(
)+/”,“,$message),该怎么办很抱歉,没有完全遵循。我必须在事情进入数据库之前格式化,至少使用mysql_real_escape_string调用。是的,但不使用nl2br()。mysql_real_escape_string()清理字符串,而不是格式化它。显示格式化应该只在显示时进行。(例如,假设您将来希望人们通过xml、json或其他任何方式获取组描述,那么

可能不会显示得很好,因此它还有其他好处)但是,我该如何解决我在这里遇到的问题:即使我使用了nl2br()在显示之前?更新了答案,
mysql\u real\u escape\u string()
也会转义新行,这意味着它们实际上不是\n\r,而是\\n\\r(这也解释了为什么显示中有4行新行)。在插入数据库后,第二页上的最终结果实际上看起来像

\\n\\r
,在第二页
nl2br()后显示时,第二页上的最终结果看起来像

\
\n\
\r
已经运行。好的,这也不太正确,我无法计数。我在代码中看到有4个,但这只能解释其中的3个。我能看到的唯一方法是将
magic\u quotes\u gpc
指令设置为true(它会自动转义所有这些指令,这确实会弄乱数据)。如果是这种情况,您还必须执行
$group\u description=mysql\u real\u escape\u字符串(stripslashes($\u POST['group\u description']);