Подтвердить что ты не робот

С# Как удалить комментарии XML/HTML с регулярным выражением

Фрагмент ниже не работает для меня.

fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline  );
4b9b3361

Ответ 1

Измените его на RegExOptions.Singleline, и все будет хорошо. Если не в режиме Singleline, точка соответствует любому символу, кроме новой строки.

Обратите внимание, что Singleline и Multiline не являются взаимоисключающими. Они делают две отдельные вещи. Чтобы процитировать MSDN:

Многострочный режим. Изменяет значение ^ и $, поэтому они совпадают в начале и конец, соответственно, любой линии, а не только начало и конец всю строку.

Однолинейный режим. изменения значение точки (.), поэтому оно соответствует каждому персонажу (вместо каждый символ, кроме \n).

Другие люди уже предложили HTML Agility Pack. Я просто чувствовал, что у вас должно быть объяснение, почему ваше Regex не будет работать:)

Ответ 2

Пожалуйста, не используйте регулярные выражения для работы с языками разметки - вам нужно использовать лучший инструмент, созданный для такого рода работы.

Используйте Html Agiliy Pack. Я даже нашел эту статью, в которой читатель (по имени Саймон Мурриер) комментирует функцию, которая использует Html Agility Pack для удаления комментариев из документа

Саймон Мурриер сказал:

Это пример кода для удаления комментарии:

static void Main(string[] args) 
{ 
  HtmlDocument doc = new HtmlDocument(); 
  doc.Load("filewithcomments.htm"); 
  doc.Save(Console.Out); // show before 
  RemoveComments(doc.DocumentNode); 
  doc.Save(Console.Out); // show after 
} 

static void RemoveComments(HtmlNode node)
{
    if (!node.HasChildNodes)
    {
        return;
    }

    for (int i=0; i<node.ChildNodes.Count; i++)
    {
        if (node.ChildNodes[i].NodeType == HtmlNodeType.Comment)
        {
            node.ChildNodes.RemoveAt(i);
            --i;
        }
    }

    foreach (HtmlNode subNode in node.ChildNodes)
    {
        RemoveComments(subNode);
    }
}

Ответ 3

Это работает для меня:

<!--(\n|.)*-->

Но я думаю, вы могли бы использовать обычный XML-документ для XML или иначе HtmlAgilityPack для HTML. Высоко не, рекомендующий анализировать разметку с помощью RegEx.

Ответ 4

Это лучший результат Google для снятия комментариев с помощью С#, и вот мой код HtmlAgilityPack для этого.

        HtmlDocument doc = new HtmlDocument
                           {
                               OptionFixNestedTags = true,
                               OptionOutputAsXml = true
                           };
        doc.LoadHtml(str);

        // Script comments from the document. 
        if (doc.DocumentNode != null)
        {
            HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//comment()");
            if (nodes != null)
            {
                foreach (HtmlNode node in from cmt in nodes
                                          where (cmt != null
                                                 && cmt.InnerText != null
                                                 && !cmt.InnerText.ToUpper().StartsWith("DOCTYPE"))
                                                 && cmt.ParentNode != null
                                          select cmt)
                {
                    node.ParentNode.RemoveChild(node);
                }
            }
        }

Это правильно работает при снятии комментариев и игнорирует doctype, который рассматривается как комментарий HtmlAgilityPack.

В то время как регулярное выражение работает в контролируемых условиях. Если вы обрабатываете HTML из дикой сети, я бы рекомендовал использовать HtmlAgilityPack. HTML, который там есть, очень непредсказуем, и регулярное выражение будет ломаться.