【问题标题】:Newline Conversion in Submitted Text in PHPPHP中提交的文本中的换行符转换
【发布时间】:2012-03-16 07:39:01
【问题描述】:

我为用户设置了一个系统,可以将他们的文章提交到我的数据库中。因为它只是 HTML,我不希望他们知道每次有换行符时都要输入 <br />,所以我在输入上使用 PHP 函数 nl2br()

我还提供了一个文章修改工具,它将把他们的文章带回表单(但是这是一个不同的页面)并允许他们编辑它。在这样做时,<br /> 元素也出现了(仍然有换行符)。为了纠正出现的
元素(无论如何我已经预料到了),我添加了preg_replace('/<br(\s+)?\/?>/i', "\n", mysql_result($result,$i,"content")),这是我在本网站的另一个问题中找到的。它完成了删除<br /> 元素的工作,但是由于它用换行符替换它们,并且换行符本来会保持不变,每次编辑帖子时,都会添加越来越多的换行符,从而使段落间隔更多并且每次更多。这是用户无法理解的。

例如,假设我在文章提交表单中输入以下内容:

 Hello, this is my article.
 I am demonstrating a new line here.

这将转换为:

Hello, this is my article.<br />
I am demonstrating a new line here.

请注意,即使换行符已转换,文本中仍然存在换行符。在编辑表单中,&lt;br /&gt; 将被转换回换行符,如下所示:

Hello, this is my article.

I am demonstrating a new line here.

因为&lt;br /&gt; 已转换为换行符,但已经有换行符。所以我想我期待的是它最初被转换成这样的东西:

Hello, this is my article.<br />I am demonstrating a new line here.

我想知道...有没有办法阻止nl2br() 函数维护原始换行符?可能与 Windows \r\n 字符有关吗?

【问题讨论】:

  • 您可能会遇到一些严重的问题,除非您的用户既擅长 HTML 又绝对值得信赖。因为如果你允许人们将 HTML 上传到你的网站,大部分是未经过滤的,你就会引入一个巨大的 XSS 漏洞,并且可能还有一堆社会工程入口点。
  • 为什么一开始提交文章时需要将新行转换为
    ?您可以在显示文章时对其进行格式化。
  • @tdammers 我目前不过滤它的唯一原因是因为我想允许他们放置以下内容:&lt;p class='caption'&gt;&lt;img src='etc' /&gt; 如果我只能允许他们放置这些,并且仅此而已,我很乐意这样做,因为我非常同意不欢迎将 HTML 提交到我的网站。我应该提一下,那些可以提交文章的人受到仅限邀请的注册过程的限制,但尽管如此,如果有机会,我仍然会解决这个问题。
  • @liaant 这比修改进入数据库的内容要好得多。我不知道为什么我没有想到这一点。
  • @rar: 甚至 也有一些 XSS 的机会,例如&lt;img src="does_not_exist.jpg" onerror="do_nasty_things()" /&gt;

标签: php newline nl2br


【解决方案1】:

您正在使用的函数nl2br 用于插入它们,而不是替换它们。如果你想用&lt;br /&gt; 替换\n,你只需要使用str_replace。像这样:

$string = str_replace("\n","<br />",$string);

在这种情况下绝对不需要正则表达式。

【讨论】:

  • 这很简单nl2br,他想要反过来(br =&gt; \n)。
  • 在重新阅读函数描述时,nl2br() 实际上并没有“替换”,它只是“在所有换行符之前添加&lt;br /&gt;。这解释了为什么换行符仍然存在。所以我希望 str_replace 会实际上替换它们。由于我是唯一将这些元素放入其中的人,我不知道为什么我一开始没有做这样的事情。
  • 另外,我通常使用类似:$string = str_replace(array("\r\n","\r","\n"),"&lt;br /&gt;",$string); 来涵盖所有常用的 CRLF 组合。
【解决方案2】:

您描述的问题似乎不是错误,而是 bl2br 的功能。您可以为它编写自己的函数,例如:

<?php
function NlToBr($inString)
{
    return preg_replace("%\n%", "<br>", $inString);
}
?>

我在 PHP 手册中的 nl2br 函数文档的 cmets 中找到了这个:http://php.net/manual/de/function.nl2br.php。如果我发布的那个对你不起作用,那么它的来源应该还有很多。

(或者只是使用刚刚发布的另一个答案中的功能,我想这也应该有效)

【讨论】:

    【解决方案3】:

    这应该可以解决它:

    preg_replace('/<br(\s+)?\/?>(?!\s*\n)/i', "\n", mysql_result($result,$i,"content"))
    

    您不能简单地删除中断,因为它们可能在同一行。此正则表达式将用换行符替换所有换行符,而不是换行符后面的换行符。

    它将在文本中留下&lt;br&gt;\n。额外的正则表达式将摆脱它们:

    preg_replace('/<br(\s+)?\/?>/i', "", $res)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      相关资源
      最近更新 更多