Как заменить текст между тегами?

Есть mhtml страница https://pastebin.com/raw/643TX3Td. Хочу заменить текст между тегами, чтобы он принял вид как обычный html. Думал сперва загрузить все в список, и потом каждое совпадение изменить, но проблема в том что теги в разных строках.

var html = File.ReadAllText("1.mhtml");
StringBuilder sb = new StringBuilder();

var items = Regex.Matches(html, "(?<=>).+?(?=</)").Cast<Match>().Select(x => x.Value).ToList();
foreach (var item in items)
{
    var t = item;
    var newitem = DecodeQuotedPrintables(item, Encoding.UTF8);
    sb.Append(html.Replace(t, newitem));
}

Т.е. задача тупо заменить текст между тегами на декодированный введите сюда описание изображения


Ответы (2 шт):

Автор решения: dIm0n

Чтобы . захватывала переводы строк, надо указать флаг s.

Например, так:

(?s)

Подробнее в этом вопросе Любое количество любых символов в notepad++.

→ Ссылка
Автор решения: Alexander Petrov

Предлагаю использовать какой-нибудь html-парсер. Например, HtmlAgilityPack.

Вот код с его использованием.

var text = File.ReadAllText("test.txt");

int start = text.IndexOf("<html>");
int end = text.IndexOf("</html>");
var html = text.Substring(start, end - start + "</html>".Length);

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

foreach (var node in doc.DocumentNode.Descendants())
{
    if (node.NodeType == HtmlNodeType.Text)
    {
        var trimmed = node.InnerText.Trim();
        if (trimmed.Length > 0)
        {
            var decoded = DecodeQuotedPrintables(trimmed, Encoding.UTF8);
            node.InnerHtml = decoded;
        }
    }
}

Console.WriteLine(doc.DocumentNode.OuterHtml);

Функция DecodeQuotedPrintables - из вашего предыдущего вопроса.

Сперва отрезал всё до тега <html> и после после </html>. Возможно, это можно и не делать. После декодирования следует присоединить отрезанные части обратно.


Как сделать обработку регуляркой:

var text = File.ReadAllText("test.txt");
var pattern = "(?<=>).+?(?=</)";
var options = RegexOptions.Singleline;
                        
var result = Regex.Replace(text, pattern, m => DecodeQuotedPrintables(m.Value, Encoding.UTF8), options);
→ Ссылка