Laden...

Regex <form> und </form> auslesen

Erstellt von Ploetzi vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.894 Views
Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren
Regex <form> und </form> auslesen

Hallo,
ich lese hier eine Internetseite ein:


System.Net.WebClient x = new System.Net.WebClient();
string inhalt = x.DownloadString(new Uri(listBox1.SelectedItem.ToString()));
MessageBox.Show(inhalt);
MatchCollection paramValues = Regex.Matches(inhalt, @"(<form).*?(/form>)");

leider hat paramValues.Count=0 obwohl eine Form enthalten ist.

Was ist falsch an meiner Regex?

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Ploetzi,

such mal nach "LINQ to HTML" auf StackOverflow.com. Da findest du einige Beispiele, wie du sowas einfacher realisieren kannst. RegEx finde ich ein wenig zu kompiliziert und für solche Sachen "falsch". Viele verwenden RegEx für solche Sachen, aber es geht auch einfacher.

zero_x

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Danke, dass schau ich mir an.
Trotzdem würd mich interessieren, wieso funktioniert dass nicht:

  string inhalt2 = (new System.Net.WebClient()).DownloadString(new Uri("http://blog.gsdh.de/2010/10/19/iphone-developer-conference-2010/"));
                MessageBox.Show("Inhalt:" + inhalt2);
                MatchCollection paramValues = Regex.Matches(inhalt2, @"<form(.*?)/form>");
                MessageBox.Show("laenge:" + paramValues.Count);

309 Beiträge seit 2008
vor 13 Jahren

Weil in dem HTML Newline Zeichen vorkommen.

Der "." steht normalerweise für ein beliebiges Zeichen außer "\n".
Nutze RegexOptions.Singleline, dann steht "." auch für "\n" und der Ausdruck trifft.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

799 Beiträge seit 2007
vor 13 Jahren

RegEx ist tückisch, gerade bei solchen Sachen.

Wenn du irgendwo ein (.) einbaust, enthält der Ausdruck jede mögliche Zeichenanordnung und daher auch das </form>. Deswegen frisst dir das . den ganzen String auf und der letzte Teil, das </form>, verhindert dann, dass das ganze matched, da ja keine Zeichen mehr da sind mit auf die der Ausdruck passen könnte.

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl
2.891 Beiträge seit 2004
vor 13 Jahren

Deswegen frisst dir das .* den ganzen String auf[...]

Das gierige Verhalten wurde jedoch schon durch das Fragezeichen in .*? schon ausgeschalten.
Aber selbst wenn: Das </form> würde _nicht _gefressen werden. Falls es mehrere </form> gibt, würde beim gierigen Verhalten alles bis zum letzten </form> matchen, beim nicht gierigen würde beim ersten aufgetretenen </form> gestoppt.

F
240 Beiträge seit 2006
vor 13 Jahren

Hallo Ploetzi,

such mal nach "LINQ to HTML" auf StackOverflow.com. Da findest du einige Beispiele, wie du sowas einfacher realisieren kannst. RegEx finde ich ein wenig zu kompiliziert und für solche Sachen "falsch". Viele verwenden RegEx für solche Sachen, aber es geht auch einfacher.

zero_x

Dazu: RegEx heißt Regular Expression. HTML ist aber nicht regular, es ist ein Baum. Also benutzt man einen DOM-Parser stattdessen. Macht das Ganze vieeeel einfacher. Dazu linke ich gerne

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags

799 Beiträge seit 2007
vor 13 Jahren

So ganz verstehe ich nicht warum dass zutreffen sollte mit dem nicht so gierigen .* da ja der Ausdruck (.)? da steht und damit der Teil (.) einmal oder keinmal vorkommt, was ja nichts an den darin enthaltenen Zeichenketten ändert.

Ich hatte genau so ein Problem schon einmal mit PHP. (Wo es dann das .* war ...)

So ganz verstehe ich die Erklärung also nicht. 🤔

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl
2.891 Beiträge seit 2004
vor 13 Jahren

[...]da ja der Ausdruck (.*)? da steht[...]

Nein, da steht aber nicht (.*)?, sondern .*?. Du kannst das als Schlüsselwort verstehen, dass gieriges Verhalten ausschaltet.
Siehe Anhang (Ausschnitt RegexLab). Unten gieriges Verhalten, oben genügsames Verhalten.
Und wie du siehst: Selbst bei gierigem Verhalten matched das Pattern korrekt. Das Problem, warum das Pattern bei Ploetzi nicht matched, sind die Zeilenumbrüche.

Zum Thema HTML mit Regex parsen:

Zitat von: Coding Horror: Parsing Html The Cthulhu Way
You can't parse [X]HTML with regex. Because HTML can't be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML.

Gruß,
dN!3L