Ich versuch gerade mal (wieder), mein Perl ein wenig aufzufrischen:
my @lines = ($content=~m/\<table[^\>]*\>([^\<]*)\<\/table\>/g);
In $content steht eine komplette HTML-Datei (ohne Zeilenumbrueche und ohne verschachtelte Tabellen).
Danach sollte doch in @lines der Inhalt saemtlicher table-Tags stehen, oder? Tuts aber nicht… @lines ist leer. Sieht jemand, was da falschlaeuft?
PS: Ja, ich weiss, dass es HTML::Parser gibt… aber ist ja eh (mehr oder weniger) nur zur Uebung.
Jop, das wars: Dank dem ([^\<]*) haette zwischen <table> und </table> kein anderes Tag sein duerfen - was bei meiner HTML-Datei natuerlich nicht der Fall war.
(.*?) funktioniert stattdessen. ? sorgt dafuer, dass dass der * "ungreedy" ist, also nicht das erste <table> mit dem letzten </table> zusammen gematched wird.
Danke an die 3 Leute, die sich mein Posting angeguckt haben [img]
http://www.fb18.de/gfx/10.gif[/img]
Danke an die 3 Leute, die sich mein Posting angeguckt haben [img]http://www.fb18.de/gfx/10.gif[/img]
ich wusste dass das helfen würde!
Daß Dir geschachtelte Tabellen das Genick brechen, wird Dir sicherlich klar sein.
Warum setzt Du eigentlich immer ein Backslash vor < und >?
Eigentlich sollten das in Regulären Ausdrücken doch keine Sonderzeichen sein, oder? Oder ist das nur Gewohnheit von der Shell?
Daß Dir geschachtelte Tabellen das Genick brechen, wird Dir sicherlich klar sein.
Jo, ist aber bei der Seite, um die es geht (Programmuebersicht von tvtoday.de) nicht der Fall
Warum setzt Du eigentlich immer ein Backslash vor < und >?
Ich kann mir nie merken, welche Sonderzeichen jetzt 'ne spezielle Bedeutung haben, also escape ich sie halt alle. Noetig isses nur bei *nachschlag* . + * ? ^ $ ( ) [ ] { } | \
richtig?
<edit>Aber hast Recht, ohne sieht es in diesem Fall VIEL uebersichtlicher aus…</edit>
Ich kann mir nie merken, welche Sonderzeichen jetzt 'ne spezielle Bedeutung haben, also escape ich sie halt alle. Noetig isses nur bei *nachschlag* . + * ? ^ $ ( ) [ ] { } | \
richtig?
Fast. Es kommt noch das Zeichen dazu, daß die RE begrenzt. In Deinem Fall also '/'.
Du könntest übrigens auch noch das 'm' vor dem '/' weglassen, oder aber ein anderes Zeichen als '/' als Begrenzer nehmen und damüßtest dann das '/' intern nicht escapen:
$content =~ /<table[^>]*>(.*?)<\/table>/g
oder
$content =~ m#<table[^>]*>(.*?)</table>#g
und noch zwei Zeichen kürzer (und für mich lesbarer) wird es so:
$content =~ m#<table.*?>(.*?)</table>#g
schoen, gefaellt mir [img]
http://www.fb18.de/gfx/14.gif[/img]
Wie wär's mit der dynamischen Variante:
my $pat = '<table[^>]*>(.*?)</table';
$content =~ /$pat/g;
Warum setzt Du eigentlich immer ein Backslash vor < und >?
Eigentlich sollten das in Regulären Ausdrücken doch keine Sonderzeichen sein, oder? Oder ist das nur Gewohnheit von der Shell?
In einigen implementationen (aber nicht Perl) sind \< \> "word boundaries", insofern ist es dehalb ratsam nicht zuviel zu "escapen".
Das betrifft eher grep.
In perl enthalten alle Metazeichen, die mit einem backslash beginnen nur alphanumerische Zeichen (zumindest bisher).
Ich kann mir nie merken, welche Sonderzeichen jetzt 'ne spezielle Bedeutung haben, also escape ich sie halt alle. Noetig isses nur bei *nachschlag* . + * ? ^ $ ( ) [ ] { } | \
richtig?
Fast. Es kommt noch das Zeichen dazu, daß die RE begrenzt. In Deinem Fall also '/'.
Und natürlich '\' [img]http://www.fb18.de/gfx/28.gif[/img]
Steht da doch schon.
Wie wär's mit der dynamischen Variante:
my $pat = '<table[^>]*>(.*?)</table';
$content =~ /$pat/g;
Welchen Vorteil hat das?
Edit: Ich schaue mal wieder ganz am Ende der 'postfreudigsten User' vorbei.
Steht da doch schon.
oops
Wie wär's mit der dynamischen Variante:
my $pat = '<table[^>]*>(.*?)</table';
$content =~ /$pat/g;
Welchen Vorteil hat das?
Das ist z.B. notwendig, wenn man den Suchausdruck erst aus einer anderen Ausgabe extrahiert.
In diesem Fall ist es natürlich ziemlich überflüssig (obwohl man sich darüber streiten kann, ob es besser lesbarist).