3

我需要对整个文本进行编码,同时保持 < 和 > 完整。

例子

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

必须变成:

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

html标签必须保持不变

4

5 回答 5

4

使用匹配标签或标签之间的内容的正则表达式,并编码之间的内容:

html = Regex.Replace(
  html,
  "(<[^>]+>|[^<]+)",
  m => m.Value.StartsWith("<") ? m.Value : HttpUtility.HtmlEncode(m.Value)
);
于 2010-02-11T14:39:31.000 回答
2

您可能会选择Html Agility Pack,然后对标签的值进行编码

于 2010-02-11T14:37:10.877 回答
1

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

于 2010-02-11T14:35:32.510 回答
0

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

于 2010-02-11T14:37:34.937 回答
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 来演示这种技术

于 2018-02-01T15:11:26.190 回答