【问题标题】:Simple text to HTML conversion简单的文本到 HTML 的转换
【发布时间】:2023-04-06 00:59:01
【问题描述】:

我有一个非常简单的asp:textbox 启用了multiline 属性。然后我只接受文本框中的文本,没有标记。有没有一种常用的方法可以将换行符和返回值转换为<p> 和<br/> 标签?

我不是在寻找什么惊天动地的东西,但同时我不只是想做这样的事情:

html.Insert(0, "<p>");
html.Replace(Enviroment.NewLine + Enviroment.NewLine, "</p><p>");
html.Replace(Enviroment.NewLine, "<br/>");
html.Append("</p>");

上面的代码不能正常工作,如生成正确的 html,如果连续有 2 个以上的换行符。拥有像&lt;br/&gt;&lt;/p&gt;&lt;p&gt; 这样的html 并不好; &lt;br/&gt; 可以删除。

【问题讨论】:

标签: c# html parsing


【解决方案1】:

结合之前的所有内容,再加上考虑文本中的标题和副标题,得出这样的结论:

public static string ToHtml(this string text)
{
    var sb = new StringBuilder();

    var sr = new StringReader(text);
    var str = sr.ReadLine();
    while (str != null)
    {
        str = str.TrimEnd();
        str.Replace("  ", " &nbsp;");
        if (str.Length > 80)
        {
            sb.AppendLine($"<p>{str}</p>");
        }
        else if (str.Length > 0)
        {
            sb.AppendLine($"{str}</br>");
        }
        str = sr.ReadLine();
    }

    return sb.ToString();
}

可以通过为短字符串定义规则来增强 sn-p

【讨论】:

    【解决方案2】:

    我知道这是旧的,但经过一番搜索后我找不到更好的东西,所以这是我正在使用的:

    public static string TextToHtml(string text)
    {
        text = HttpUtility.HtmlEncode(text);
        text = text.Replace("\r\n", "\r");
        text = text.Replace("\n", "\r");
        text = text.Replace("\r", "<br>\r\n");
        text = text.Replace("  ", " &nbsp;");
        return text;
    }
    

    如果由于某种原因您不能使用 HttpUtility,那么您将不得不以其他方式进行 HTML 编码,并且需要担心很多次要细节(不仅仅是&lt;&gt;&amp;)。

    HtmlEncode 只为您处理特殊字符,因此之后我将任何回车和/或换行符的组合转换为 BR 标记,并将任何双空格转换为单空格加 NBSP。

    您可以选择在最后一部分使用 PRE 标记,如下所示:

    public static string TextToHtml(string text)
    {
        text = "<pre>" + HttpUtility.HtmlEncode(text) + "</pre>";
        return text;
    }
    

    【讨论】:

    • 这应该是公认的答案,因为 PRE 标记之间的周围文本实际上强制使用双行,而不是单行换行。
    【解决方案3】:

    我知道这是一篇旧帖子,但我最近在使用 C# 和 MVC4 时遇到了类似的问题,所以想分享我的解决方案。

    我们在数据库中保存了一个描述。该文本是从网站直接复制/粘贴的,我们希望使用 &lt;p&gt; 标签将其转换为语义 HTML。这是我们解决方案的简化版本:

    string description = getSomeTextFromDatabase();
    foreach(var line in description.Split('\n')
    {
        Console.Write("<p>" + line + "</p>");
    }
    

    在我们的例子中,为了写出一个变量,我们需要在任何变量或标识符之前加上 @ 前缀,因为 ASP.NET MVC 框架中的 Razor 语法。但是,我已经用Console.Write 展示了这一点,但您应该能够基于此弄清楚如何在您的特定项目中实现这一点:)

    【讨论】:

      【解决方案4】:

      您的另一个选择是获取文本框内容,而不是尝试换行,而是将文本放在 PRE 标记之间。像这样:

      <PRE>
      Your text from the text box...
      
      and a line after a break...
      </PRE>
      

      【讨论】:

      • 我从来不知道。这样可以省去很多麻烦。
      【解决方案5】:

      根据您对内容所做的具体操作,我的典型建议是仅使用 &lt;br /&gt; 语法,而不是尝试处理段落。

      【讨论】:

        【解决方案6】:

        把它放在&lt;pre&gt; 标记中怎么样。这不就是它的用途吗?

        【讨论】:

        • 为什么不呢?您是否更愿意重新发明轮子?
        • 我不想保留换行符和空格。我想将文本转换为语义正确的 html。
        • PRE 将文本框重新格式化为像 Courier 这样的等宽字体,并将换行符视为

          而不是

        猜你喜欢
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        相关资源
        最近更新 更多