以下片段對我無效。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