-1

Есть 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)); }

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

Radzhab
  • 3,772

2 Answers2

1

Предлагаю использовать какой-нибудь 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);

  • 1
    Только вот DecodeQuotedPrintables, на который вы ссылаетесь, дает белеберду и тут изначально данного вопроса не было бы, если автор понял как работать с mhtml (о чем я написал ему в том вопросе), а этот вопрос явный ведь дубликат, не? – EvgeniyZ Aug 19 '20 at 13:08
  • @EvgeniyZ - да, ваш ответ единственно правильный. А этот вопрос, вероятно, следует закрыть. – Alexander Petrov Aug 19 '20 at 13:10
0

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

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

(?s)

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

dIm0n
  • 407