Мне нужно закодировать весь текст, оставив <и> без изменений.
пример
<p>Give me 100.000 €!</p>
должно стать:
<p>Give me 100.000 €!</p>
теги html должны оставаться неизменными
Используйте регулярное выражение, которое соответствует тегу или тому, что находится между тегами, и закодируйте, что между:
html = Regex.Replace( html, "(<[^>]+>|[^<]+)", m => m.Value.StartsWith("<") ? m.Value : HttpUtility.HtmlEncode(m.Value) );
вы можете перейти на Html Agility Pack и затем кодировать значения тегов
Может быть, использовать string.replace только для тех символов, которые вы хотите кодировать?
Как и предполагали другие, этого можно достичь с помощью 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 скрипку, чтобы продемонстрировать эту технику .
Вы можете использовать HtmlTextWriter в дополнение к htmlencode. Таким образом, вы должны использовать HtmlTextWriter для установки <p></p>, а затем просто установить тело <p></p> с помощью HtmlEncode. HtmlTextWriter allow ToString (); и куча других методов, так что кода не должно быть намного больше.
<p></p>