Фрагмент ниже не работает для меня.
fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline );
Фрагмент ниже не работает для меня.
fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline );
Измените его на RegExOptions.Singleline
, и все будет хорошо.
Если не в режиме Singleline, точка соответствует любому символу, кроме новой строки.
Обратите внимание, что Singleline
и Multiline
не являются взаимоисключающими. Они делают две отдельные вещи. Чтобы процитировать MSDN:
Многострочный режим. Изменяет значение ^ и $, поэтому они совпадают в начале и конец, соответственно, любой линии, а не только начало и конец всю строку.
Однолинейный режим. изменения значение точки (.), поэтому оно соответствует каждому персонажу (вместо каждый символ, кроме \n).
Другие люди уже предложили HTML Agility Pack. Я просто чувствовал, что у вас должно быть объяснение, почему ваше Regex не будет работать:)
Пожалуйста, не используйте регулярные выражения для работы с языками разметки - вам нужно использовать лучший инструмент, созданный для такого рода работы.
Используйте 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); } }
Это работает для меня:
<!--(\n|.)*-->
Но я думаю, вы могли бы использовать обычный XML-документ для XML или иначе HtmlAgilityPack для HTML. Высоко не, рекомендующий анализировать разметку с помощью RegEx.
Это лучший результат 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, который там есть, очень непредсказуем, и регулярное выражение будет ломаться.