以下の断片は私のためには機能しません。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
は互いに排他的ではありません。彼らは2つの別々のことをします。 MSDNを引用するには:
マルチラインモード ^と$の意味を変更して、先頭の数字が で、末尾がそれぞれ で始まり、末尾が の文字列全体に一致するようにします。
シングルラインモード。 ドットの意味を変更します( の代わりに、\ n以外のすべての文字に が一致します)。
他の人がすでにHTMLアジリティパックを提案しています。私はちょうどあなたの正規表現がうまくいかない理由についての説明が必要だと思った:)
マークアップ言語で動作するように正規表現を使用しないでください - あなたは仕事のようなもののために構築され、より良いツールを使用する必要があります。
代わりにHtml Agiliy Packを使用してください。
サイモンMourier言った:
これはサンプルです私もドキュメントからコメントを削除するために、HTMLの敏捷性パックを使用する関数とthis article(サイモン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); } }
他のスレッドであなたと同じようなコメントを見ました。なぜ、私は時折のWebスクレイピングのためのより良いツールを使用して、htmlページ上の開始マーカーと終了マーカーの間にhrefを抽出するべきかを確信していません。 – MicMit
Andrewが正しいです。 (a)事前に制限された固定されたコンテンツが使用されているか、(b)結果に間違いがないことを知らない限り、[X] [HT] MLを正規表現で解析することはできません。リンクの書式設定のバラツキがはるかに大きいため、コメントの解析はリンクの解析よりも簡単ですが、依然として信頼性はありません。 – bobince
コードサンプルが機能しません。コレクションを列挙している間にノードを変更することはできません。 –
この1つは私の作品:
コメントを削除するためのコード<!--(\n|.)*-->
しかし、私はあなたがXMLのために通常のXML文書を使うことができると思っています。そうでなければHtmlAgilityPack HTMLです。高くではない RegExを使用してマークアップを解析することを推奨します。
あなたの乗数には、貪欲でない量限定子を置くべきです。 '<! - (\ n |。)*? - >'また、この問題は変更するSingleLineフラグを加えるだけで解決できます。改行も受け入れる。 –
@Matthew。はい。同意する。あなたは理論的に正しいです。しかし、私はSingleLineフラグを試しましたが、結果は変わりません。また、貪欲で欲張りのない仕事の両方。実際の質問に答えるためにradsoftware.com.au/?from=RegexDesigner –
これは、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は非常に予測不可能であり、正規表現は壊れてしまいます。
+1を使用してテストされています。 – womp
はい、動作します。最初は3番目のパラメータを指定せず、動作しませんでしたし、RegExOptions.SingleLineが暗黙のように思っていましたが、Multilineがデフォルトのように見えます。 – MicMit
名前とは関係なく、単一行と複数行は反対ではありません。どちらのオプションもデフォルトではオフになっていて、1に設定しても他のオプションには影響しません。 Singlelineはドットメタキャラクタの動作を変更し、Multilineは '^'と '$'アンカーの動作を変更します。 –