закодировать HTML в Asp.net C #, но оставить теги нетронутыми - PullRequest
3 голосов
/ 11 февраля 2010

Мне нужно закодировать весь текст, оставив <и> без изменений.

пример

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

должно стать:

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

теги html должны оставаться неизменными

Ответы [ 5 ]

3 голосов
/ 11 февраля 2010

Используйте регулярное выражение, которое соответствует тегу или тому, что находится между тегами, и закодируйте, что между:

html = Regex.Replace(
  html,
  "(<[^>]+>|[^<]+)",
  m => m.Value.StartsWith("<") ? m.Value : HttpUtility.HtmlEncode(m.Value)
);
2 голосов
/ 11 февраля 2010

вы можете перейти на Html Agility Pack и затем кодировать значения тегов

1 голос
/ 11 февраля 2010

Может быть, использовать string.replace только для тех символов, которые вы хотите кодировать?

0 голосов
/ 01 февраля 2018

Как и предполагали другие, этого можно достичь с помощью 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 скрипку, чтобы продемонстрировать эту технику .

0 голосов
/ 11 февраля 2010

Вы можете использовать HtmlTextWriter в дополнение к htmlencode. Таким образом, вы должны использовать HtmlTextWriter для установки <p></p>, а затем просто установить тело <p></p> с помощью HtmlEncode. HtmlTextWriter allow ToString (); и куча других методов, так что кода не должно быть намного больше.

...