Poniższy fragment nie działa dla mnie.C# Jak usunąć komentarze XML/HTML z wyrażeniem regularnym
fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline );
Poniższy fragment nie działa dla mnie.C# Jak usunąć komentarze XML/HTML z wyrażeniem regularnym
fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline );
Zamiast tego zmień go na RegExOptions.Singleline
i będzie działał dobrze. Gdy nie jest w trybie Singleline, kropka pasuje do dowolnego znaku, , z wyjątkiem nowego wiersza.
Należy pamiętać, że Singleline
i Multiline
nie wykluczają się wzajemnie. Robią dwie oddzielne rzeczy. Zacytować MSDN:
trybu wielowierszowego. Zmienia znaczenie ^ i $ więc pasuje na początku i na końcu odpowiednio z każdej linii, i nie tylko początek i koniec cały ciąg.
Tryb pojedynczej linii. Zmienia znaczenie kropki (.), Aby dopasowywał każdy znak (zamiast każdy znak za wyjątkiem \ n).
Inne osoby już zasugerowały pakiet Agility HTML. Po prostu poczułem, że powinieneś wytłumaczyć, dlaczego Twój Regex nie zadziałał :)
Proszę nie używać wyrażeń regularnych do pracy z języków znaczników - trzeba użyć lepszego narzędzia, który jest wbudowany do tego rodzaju pracy.
Zamiast tego użyj Html Agiliy Pack. Znalazłem nawet this article w którym czytnik (o nazwie Simon Mourier) Komentarze z funkcją, która używa html Agility Pack do usuwania komentarzy z dokumentu:
Simon MOURIER powiedział:
Jest to próbka Kod do usunięcia komentarzy:
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); } }
Widziałem podobny komentarz w innym wątku.Nie jestem przekonany, dlaczego powinienem użyć lepszego narzędzia do okazjonalnego skrobania przez WWW wyodrębniania href pomiędzy znacznikiem początkowym i końcowym na stronie html, którą niektórzy komentowali. – MicMit
Andrew ma rację. Nie możesz sparsować [X] [HT] ML za pomocą wyrażenia regularnego, chyba że (a) wiesz z góry, że używany jest bardzo ograniczony i ustalony zestaw treści lub (b) nie masz nic przeciwko dużej ilości błędów w wynikach. Analizowanie komentarzy jest mniej prawdopodobne niż przetwarzanie linków, ponieważ formatowanie linków jest o wiele bardziej zmienne, ale nadal jest niewiarygodne. – bobince
Próbka kodu nie działa. Nie można modyfikować węzłów podczas wyliczania w kolekcji –
Ten działa dla mnie:
<!--(\n|.)*-->
Ale myślę, że można użyć normalnego dokumentu XML dla XML lub inaczej HtmlAgilityPack dla HTML. Wysoce nie zaleca analizowanie znaczników za pomocą RegEx.
Powinieneś umieścić nieważny kwantyfikator na swoim mnożniku, tj. '' Ten problem można rozwiązać, dodając po prostu flagę SingleLine, która modyfikuje. również zaakceptować nowe linie. –
@Matthew. Tak. Zgadzam się. Teoretycznie masz rację. Ale próbowałem flagę SingleLine i nie zmienia to wyniku. Także praca nie chciwa i chciwa. Przetestowano za pomocą radsoftware.com.au/?from=RegexDesigner –
To jest najlepszy wynik Google do usuwania komentarzy za pośrednictwem C#, a oto mój kod HtmlAgilityPack do robienia tego.
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);
}
}
}
To działa poprawnie w odpędzania komentarzach, a ignoruje doctype, który jest traktowany jako komentarz przez HtmlAgilityPack.
Chociaż regex działa w kontrolowanych warunkach. Jeśli przetwarzasz HTML z dzikiej sieci, polecam użycie HtmlAgilityPack. Kod HTML, który jest tam obecny, jest bardzo nieprzewidywalny, a wyrażenie regularne zostanie przerwane.
+1 za odpowiedź na faktyczne pytanie. – womp
Tak, to działa. Na początku nie dostarczyłem trzeciego parametru i nie zadziałało i myślałem, że RegExOptions.SingleLine jest domniemane, ale wygląda na to, że Multiline jest domyślny. – MicMit
Singeleline i Multiline nie są przeciwieństwami, bez względu na to, co sugerują imiona. Obie opcje są domyślnie wyłączone, a ustawienie jednej nie ma wpływu na drugą. Singleline zmienia zachowanie metaznaku kropki, a Multiline zmienia zachowanie kotwic "^" i "$". –