在Asp.net C#中编码html,但保留标签完好无损

时间:2010-02-11 14:30:16

标签: c# html-encode

我需要编码整个文本,同时保留<和>完好。

例如

<p>Give me 100.000 €!</p>

必须成为:

<p>Give me 100.000 &euro;!</p>

html标签必须保持完整

5 个答案:

答案 0 :(得分:2)

您可以选择Html Agility Pack,然后对代码的值进行编码

答案 1 :(得分:2)

使用匹配标记或标记之间的正则表达式,并对以下内容进行编码:

html = Regex.Replace(
  html,
  "(<[^>]+>|[^<]+)",
  m => m.Value.StartsWith("<") ? m.Value : HttpUtility.HtmlEncode(m.Value)
);

答案 2 :(得分:1)

也许只使用string.replace来表示你想编码的那些字符?

答案 3 :(得分:0)

除了htmlencode之外,您还可以使用HtmlTextWriter。因此,您可以使用HtmlTextWriter设置<p></p>,然后使用HtmlEncode设置<p></p>的正文。 HtmlTextWriter允许ToString();和一堆其他方法,所以它不应该是更多的代码。

答案 4 :(得分:0)

正如其他人所说,这可以通过HtmlAgilityPack实现。

 public static class HtmlTextEncoder
 {
    public static string HtmlEncode(string html)
    {
        if (html == null) return null;

        var doc = new HtmlDocument();
        doc.LoadHtml(html);

        EncodeNode(doc.DocumentNode);

        doc.OptionWriteEmptyNodes = true;
        using (var s = new MemoryStream())
        {
            doc.Save(s);
            var encoded = doc.Encoding.GetString(s.ToArray());
            return encoded;
        }
    }

    private static void EncodeNode(HtmlNode node)
    {
        if (node.HasChildNodes)
        {
            foreach (var childNode in node.ChildNodes)
            {
                if (childNode.NodeType == HtmlNodeType.Text)
                {
                    childNode.InnerHtml = HttpUtility.HtmlEncode(childNode.InnerHtml);
                }
                else
                {
                    EncodeNode(childNode);
                }
            }
        }
        else if (node.NodeType == HtmlNodeType.Text)
        {
            node.InnerHtml = HttpUtility.HtmlEncode(node.InnerHtml);
        }
    }
}

这将遍历HTML中的所有节点,并用HTML编码的文本替换任何文本节点。

我创建了.NET fiddle to demonstrate this technique