以下片段对我无效。C#如何用正则表达式删除XML/HTML注释
fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline );
以下片段对我无效。C#如何用正则表达式删除XML/HTML注释
fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline );
改为RegExOptions.Singleline
,它会工作得很好。 如果不是在单线模式,点任意字符,匹配除换行符。
注意Singleline
和Multiline
不是相互排斥的。他们做了两件独立的事情。引用MSDN:
多行模式。变化 意思^和$所以他们分别匹配开头 和结束,任何线路, ,而不是仅仅是个开始和 整个字符串结束。
单行模式。 点的含义(。)所以它 匹配每个字符(而不是除\ n之外的每个字符的 )。
其他人已经建议的HTML敏捷性包。我只是觉得你应该解释为什么你的正则表达式不起作用:)
请不要使用正则表达式来处理标记语言 - 您需要使用一种更好的工具来构建这种工作。
使用Html Agiliy Pack代替。我甚至发现this article其中(名叫西门Mourier)阅读器与使用HTML敏捷性包从一个文档中删除评论功能评论:
西蒙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<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 |。)*? - >'此外,只需添加修改的SingleLine标志即可解决此问题。也接受换行.. – 2009-08-20 05:23:24
@Matthew。是。我同意。你理论上是正确的。但我试过SingleLine标志,它不会改变结果。还有非贪心和贪婪的工作。使用radsoftware.com.au/?from=RegexDesigner – 2009-08-20 06:14:17
这是Google通过C#剥离注释的最好结果,这里是我的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当作注释处理的文档类型。
虽然正则表达式在受控条件下工作。如果你正在处理来自野生网站的HTML,那么我建议使用HtmlAgilityPack。那里的HTML是非常不可预测的,正则表达式会中断。
+1进行测试,以回答实际问题。 – womp 2009-08-20 05:24:48
是的,它的工作原理。起初我没有提供第三个参数,它没有工作,我认为RegExOptions.SingleLine是隐含的,但看起来像Multiline是默认的。 – MicMit 2009-08-20 06:27:47
单线和多线不是对立的,不管名字的意思如何。这两个选项默认都是关闭的,设置一个对另一个没有影响。 Singleline改变点元字符的行为,Multiline改变'^'和'$'锚点的行为。 – 2009-08-20 06:56:42