C#如何使用正则表达式删除XML / HTML注释

下面的片段对我不起作用。

fragment = Regex.Replace(fragment, "", String.Empty , RegexOptions.Multiline ); 

改为将其更改为RegExOptions.Singleline ,它会正常工作。 当不处于单线模式时,点匹配换行符之外的任何字符。

请注意, SinglelineMultiline不是互斥的。 他们做两件事。 引用MSDN:

多线模式 。 更改^和$的含义,使它们分别在任何行的开头和结尾匹配,而不仅仅是整个字符串的开头和结尾。

单线模式 。 更改点(。)的含义,使其匹配每个字符(而不是除\ n之外的每个字符)。

其他人已经建议使用HTML Agility Pack。 我觉得你应该解释为什么你的正则表达式不起作用:)

请不要使用正则表达式来处理标记语言 – 您需要使用为此类作业构建的更好的工具。

请改用Html Agiliy Pack 。 我甚至发现这篇文章中有一个读者(名为Simon Mourier)使用Html Agility Pack从文档中删除注释的函数注释:

Simon Mourier说:

这是删除评论的示例代码:

 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 

这个对我有用:

  

但我认为你可以使用普通的XML文档来处理XML,或者使用HtmlAgilityPack for HTML。 强烈建议不要使用RegEx解析标记。

这是通过C#剥离评论的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); } } } 

这在剥离注释时正常工作,并忽略被HtmlAgilityPack视为注释的doctype。

虽然正则表达式在受控条件下工作。 如果您正在从野外网络处理HTML,那么我建议使用HtmlAgilityPack。 那里的HTML非常难以预测,正则表达式会破坏。