【发布时间】:2009-08-20 05:04:34
【问题描述】:
下面的片段对我不起作用。
fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline );
【问题讨论】:
下面的片段对我不起作用。
fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline );
【问题讨论】:
改为RegExOptions.Singleline 就可以了。
当不在单行模式下时,点匹配任何字符,除了换行符。
请注意,Singleline 和 Multiline 并不相互排斥。他们做两件不同的事情。引用 MSDN:
多行模式。改变的意思 ^ 和 $ 所以它们在开头匹配 和结束,分别,任何行, 而不仅仅是开始和结束 整个字符串。
单行模式。变化 点 (.) 的含义,所以它 匹配每个字符(而不是 除了 \n) 之外的所有字符。
其他人已经建议使用 HTML Agility Pack。我只是觉得你应该解释一下为什么你的正则表达式不起作用:)
【讨论】:
^ 和 $ 锚点的行为。
请不要使用正则表达式来处理标记语言 - 您需要使用专为此类工作构建的更好的工具。
请改用Html Agiliy Pack。我什至在this article 中找到了一个阅读器(名为 Simon Mourier)的 cmets,该函数使用 Html Agility Pack 从文档中删除 cmets:
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<node.ChildNodes.Count; i++) { if (node.ChildNodes[i].NodeType == HtmlNodeType.Comment) { node.ChildNodes.RemoveAt(i); --i; } } foreach (HtmlNode subNode in node.ChildNodes) { RemoveComments(subNode); } }
【讨论】:
这是通过 C# 剥离 cmets 的最高 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);
}
}
}
这在剥离 cmets 时可以正常工作,并忽略 HtmlAgilityPack 将其视为注释的 doctype。
虽然正则表达式确实在受控条件下工作。如果您正在处理来自狂野网络的 HTML,那么我建议您使用 HtmlAgilityPack。那里的 HTML 非常不可预测,正则表达式会中断。
【讨论】:
【讨论】:
<!--(\n|.)*?--> 另外,这个问题可以通过简单地添加修改 .也接受换行符..
(\n|.)*,因为它不精确,由于涉及大量回溯,效率极低,并且是多余的,因为仅仅.和(?s)或RegexOptions.Singleline就可以完成这项工作以更有效的内置方式。由于使用了这种不幸的模式,已经报告了很多问题。请考虑删除帖子,或更改解决方案。