【问题标题】:How to convert SQL value that has newlines into proper paragraphs <p> in HTML?如何将具有换行符的 SQL 值转换为 HTML 中的正确段落 <p>?
【发布时间】:2012-01-16 00:47:20
【问题描述】:

我有一个从 SQL 返回的文本,其中可能包含换行符。但是,由于我将值放在 &lt;p&gt;&lt;/p&gt; 标记之间,因此它忽略了换行符。

例如,如果 SQL 中的文本实际上是这样的(行之间有 CRLF):

foobar car
carbar foo

HTML代码变成:

<p>foobar car
carbar foo</p>

这只是呈现为:

foobar car carbar foo

最终,我似乎想检测换行符,然后添加适当的 HTML,例如:

<p>foobar car</p><p>carbar foo</p>

甚至

<p>foobar car<br/><br/>carbar foo</p>

这应该在前端处理还是在返回数据的 SQL 查询中处理?似乎应该在前端代码上处理(在我的 ASP.NET 视图中),但如果是这样,如何处理?

我注意到 PHP 中有一个函数可以处理这种情况:nl2br (http://www.php.net/manual/en/function.nl2br.php) 但不幸的是,这对我没有帮助: )

【问题讨论】:

标签: asp.net sql sql-server


【解决方案1】:

执行这种逻辑通常更好的是您的演示代码,然后是您的数据库或中间层。

我推荐的方法是编写一些 .net 代码,用 &lt;br/&gt; 标签替换 cr 和 lf。代码本身很简单,下面是一个模拟您的 php nl2br 函数的示例:

string nl2br(string text)
{
    return text.Replace("\r", "<br/>").Replace("\n", "<br/>");
}

您也可以使用REPLACE()CHAR() 在SQL 中执行这种转换,尽管最好在表示层而不是数据库层执行这种转换。

SQL 方法是:

SELECT REPLACE(REPLACE(myStr, char(13), '<br/>'), CHAR(10), '<br/>')

这会将CHAR(13)CHAR(10)(cr 和lf)替换为&lt;br/&gt; 标签。

第三种选择是使用 &lt;pre&gt; 标签在 preformatted text 处呈现您的文本,尽管这实际上只适用于少数用例(例如在 StackOverflow 上显示代码)

例如

<pre>
    foobar car 
    carbar foo
</pre>

会像这样呈现:

富吧车 卡巴富

保持空格和换行不变。

【讨论】:

  • 使用 &lt;pre&gt; 在语义上是错误的,对 SEO 不利,对屏幕阅读器不利,并且在任何情况下都不应用于格式化纯文本。
  • 我包含该选项是为了完整性,但也因为(尽管极不可能)考虑到上下文很少,它在 OP 实际场景中可能是正确的。我的建议仍然是在 asp.net 代码中执行转换。
  • 我认为你应该强调哪个解决方案更好,否则 OP 可能会使用 &lt;pre&gt; 解决方案,因为他不知道它的陷阱。
  • 这部分对我有用,但我遇到的问题是 ASP.NET 是 HTML 将
    编码为 <br/>当它显示时。我怎样才能防止这种情况发生?
  • @TMC 如果没有看到您的代码,很难说出它的来源,但这应该会有所帮助:Server.HtmlDecode("&amp;lt;br/&amp;gt;"); 使用Server.HtmlDecode() 对页面上显示的编码 html 实体进行解码。跨度>
【解决方案2】:

您可以在 sql server 或您的应用程序中执行此操作,要在 sql server 中执行此操作,您可以使用以下代码替换回车符:

select REPLACE(Comments,CHAR(13),' <br />') from Production.ProductReview

编辑:

您可以通过 SqlDataReader 以更优雅的形式在 .Net 代码中处理并更改文本:

        var target = "this is the line \r\n and this is another line";

        Regex regex = new Regex(@"(\r\n|\r|\n)+");

        string newText = regex.Replace(target, "<br />");

【讨论】:

  • 使用正则表达式的方法有些奏效。但是,问题在于 ASP.NET 在显示时将&lt;br /&gt; 编码为&amp;lt;br/&amp;gt;。我怎样才能防止这种情况发生?
【解决方案3】:

您确实应该使用您的网络语言(我猜是 asp.net)来执行此操作,但如果您必须在 SQL 中执行此操作,请按照以下方式完成:

MySQL:

SELECT REPLACE(column_name, "\r\n", "<br/>");

T-SQL(MS SQL 服务器):

SELECT REPLACE(REPLACE(column_name, CHAR(13), ''), CHAR(10), '<br/>');

【讨论】:

    【解决方案4】:

    如果您想在 SQL Server 中执行此操作,那么一种方法是使用 replace 函数将 char(13) + char(10) 替换为

    例子

    declare @s varchar(1000)
    
    select @s = 'line1
    line2'
    
    select replace(@s,char(13) + char(10),'<br><br>')
    

    输出

    line1<br><br>line2
    

    在你的情况下

    select replace(ColumnName,char(13) + char(10),'<br><br>')
    From SomeTable
    

    【讨论】:

      【解决方案5】:

      只需在 ASP.NET 中处理您的数据。没有理由将工作负载放在 SQL 服务器上。

      text = text.Replace("\r", "</p>\n<p>").Replace("\n","</p>\n<p>");
      text = "<p>" + text + "</p>";
      

      上面的代码会转

      foobar car
      carbar foo
      

      进入

      <p>foobar car</p>
      <p>carbar foo</p>
      

      【讨论】:

        猜你喜欢
        • 2013-03-03
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 2012-07-16
        • 1970-01-01
        相关资源
        最近更新 更多