Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9114[/thread]

regex match: mehrere ausdrücke in EINER Zeile

Leser: 1


<< >> 5 Einträge, 1 Seite
maxmaster69
 2007-06-23 22:07
#77764 #77764
User since
2006-11-22
2 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe mir ein kleines script gebastelt, das mir in einem html/htm file links (jpg, zip, rar,...) sammelt.
das ganze mache ich in einer while-schleife mit dem match operator (if ($line =~ m|.*href="(http.*\.zip)".*|))
das ganze funktioniert leider nur, wenn nur ein link pro zeile vorkommt :(

...ShowBild('http://url/1.jpg'); return false;<a href="#" onClick="ShowBild('http://url/2.jpg'); return false; ...

hier hat mein script seine grenzen

kann mir jemand verraten, wie ich mehrere ausdrücke (unabhängig von der anzahl!!!) pro zeile mit dem gleichen suchmuster finden und speichern kann

die statische variante m/(\d+)\.(\d+)\.(\d+)\.(\d+)/ (zb für ip-adressen) ist mir bekannt - das ist nicht das was ich suche!

in hoffnung auf hilfe,
danke
coax
 2007-06-23 23:27
#77765 #77765
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Am Beispiel eines Strings, es sollen alle Zahlen ermittelt werden.
Code: (dl )
1
2
3
4
5
my $line = 'abc123def456ghi';

if (my @matches = $line =~ m/\w+?(\d+)/g) {
   print "@matches\n";
}

der Modifizierer 'g' den du am Ende der Regexp siehst, sorgt dafuer das das der Ausdruck mehrmals zutrifft, die Ergebnisse laden in @matches.

Fuer solche Aufgaben gibt es das Modul CPAN:HTML::LinkExtor oder auch CPAN:HTML::TreeBuilder.\n\n

<!--EDIT|coax|1182626863-->
,,Das perlt aber heute wieder...'' -- Dittsche
linse
 2007-06-23 23:56
#77766 #77766
User since
2006-02-02
61 Artikel
BenutzerIn
[Homepage]
user image
Du könntest auch noch
Code: (dl )
1
2
my $line = 'abc123def456ghi';
print $1,"\n" while ($line =~/\w+?(\d+)/g);

schreiben.
bloonix
 2007-06-24 00:46
#77767 #77767
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=maxmaster69,23.06.2007, 20:07]kann mir jemand verraten, wie ich mehrere ausdrücke (unabhängig von der anzahl!!!) pro zeile mit dem gleichen suchmuster finden und speichern kann[/quote]
Ja, mit /g.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use strict;
use warnings;

my @strings = (
  '<a href="http://.../1.zip">1</a><a href="http://.../2.zip">2</a>',
  '<a href="http://.../3.zip">3</a><a href="http://.../4.zip">4</a>',
  '<a href="http://.../5.zip">5</a><a href="http://.../6.zip">6</a>',
  '<a href="http://.../7.zip">7</a><a href="http://.../8.zip">8</a>',
  '<a href="http://.../9.zip">9</a><a href="http://.../10.zip">10</a>',
);

foreach my $line (@strings) {
  foreach my $zip ( $line =~ m|href="(http.+?\.zip)"|g ) {
     print $zip, "\n";
  }
}


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
http://.../1.zip
http://.../2.zip
http://.../3.zip
http://.../4.zip
http://.../5.zip
http://.../6.zip
http://.../7.zip
http://.../8.zip
http://.../9.zip
http://.../10.zip


Ausserdem ist \d+.\d+.\d+.\d+ nicht die passende Regex um
IP-Adresssen zu matchen.

Das müsste ungefähr so aussehen:
Code: (dl )
1
2
my $octet   = q/(?: 25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})/;
my $ipaddr  = qr/^$octet\.$octet\.$octet\.$octet\z/x;
\n\n

<!--EDIT|opi|1182636684-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
maxmaster69
 2007-06-24 11:55
#77768 #77768
User since
2006-11-22
2 Artikel
BenutzerIn
[default_avatar]
Hallo,
Danke für eure schnellen antworten!!
Das Ding funktioniert jetzt!!

Einen kleinen Fehler hatte ich noch, in dem ich in der while-schleife (zum zeilenweisen einlesen eines files) mit einer if-bedingung abfragte und somit nur die erste url bekam.

das ganze sieht jetzt so aus, UND FUNKTIONIERT

$>cat test-file.txt
<http://woswoasi.ru/bild1.jpg,<a>,http://koschosei.ro/bild2.jpg,<irgendwas in tags>,error,http://desletzte/bild.jpg>
$>cat url-extract.pl
[...]
while ($line = <IN>)
{
if ($line =~ m/(http.+?\.jpg)/g)
{
print OUT "wget -c $1\n";
}
}
close (OUT);
close (IN);

$>url-extract.pl test-file.txt

$>cat wget-c-files.bat
wget -c http://woswoasi.ru/bild1.jpg
wget -c http://koschosei.ro/bild2.jpg
wget -c http://desletzte/bild.jpg


danke nochmal für alle meldungen!!
<< >> 5 Einträge, 1 Seite



View all threads created 2007-06-23 22:07.