Schrift
[thread]9029[/thread]

mal wieder regex ^^: brauch mal regex hilfe

Leser: 1


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
RPerl
 2007-05-23 22:04
#76864 #76864
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Hallo Leute!

Ich hoffe mal, ihr koennt mir auch dieses mal wieder helfen! :)

Hab in $inhalt folgendes:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<font face="arial"><b>yahoo.de</b> has address <b>217.12.6.29</b><br><small>Found 332 websites with the IP <b>217.12.6.29</b></small></font><br><br><font face="arial" size="-1">1) 10millionenspiel.yahoo.de<br>
2) 360.yahoo.de<br>
3) 50erstedates.yahoo.de<br>
4) acrylic-furniture.info.yahoo.de<br>
5) adresse.yahoo.dk<br>
6) adsl.yahoo.it<br>
7) advent.yahoo.de<br>
8) agenda.yahoo.it<br>
9) ahdod.yahoo.co.uk<br>
10) ahmed.yahoo.fr<br>
11) aide.yahoo.fr<br>
12) angelaenea.yahoo.it<br>
13) angellovespells.com.yahoo.it<br>
14) annunci.yahoo.it<br>
15) answers.yahoo.it<br>
16) antispam.yahoo.it<br>
17) at.yahoo.com<br>
18) auctions.yahoo.fr<br>
19) auktionen.yahoo.de<br>
20) av.yahoo.co.uk<br>
21) av.yahoo.de<br>
22) av.yahoo.fr<br>
[...] # noch weitere Eintraege hier
</font> </td></tr></table>


So weit so gut? Ich muss alle Domains in ein array bekommen.
Hab mir da folgendes regex schon ausgedacht, aber das matched nur zwei domains:

Code (perl): (dl )
print $inhalt =~ m/\d\)\s(.*)\n(.*)/;


Aber ich brauch _alles_ zwischen

<font face="arial" size="-1"> [HIER] </font> </td></tr></table>

Wie mach ich das? :P *ratlos*

Danke und schoenen Abend!

perl\n\n

<!--EDIT|RPerl|1179943509-->
moritz
 2007-05-24 01:06
#76865 #76865
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Leichter ist es sicher, wenn du es erst mal mit split in einzelne Zeilen zerlegst, dann ist die Regex für den Domainnamen sehr viel einfacher (dann kannst du z.B. mit map oder grep ran).
Ronnie
 2007-05-24 01:16
#76866 #76866
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
CPAN:Regexp::Common::URI könnte hilfreich sein.
vayu
 2007-05-24 12:26
#76867 #76867
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
klappt aber nur wenn das ganze wirklich genau in der syntax dasteht :)

Nummer) url<br>

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $d = '<font face="arial"><b>yahoo.de</b> has address <b>217.12.6.29</b><br><small>Found 332 websites with the IP <b>217.12.6.29</b></small></font><br><br><font face="arial" size="-1">1) 10millionenspiel.yahoo.de<br>
2) 360.yahoo.de<br>
3) 50erstedates.yahoo.de<br>
4) acrylic-furniture.info.yahoo.de<br>
5) adresse.yahoo.dk<br>
6) adsl.yahoo.it<br>
7) advent.yahoo.de<br>
8) agenda.yahoo.it<br>
9) ahdod.yahoo.co.uk<br>
10) ahmed.yahoo.fr<br>
11) aide.yahoo.fr<br>
12) angelaenea.yahoo.it<br>
13) angellovespells.com.yahoo.it<br>
14) annunci.yahoo.it<br>
15) answers.yahoo.it<br>
16) antispam.yahoo.it<br>
17) at.yahoo.com<br>
18) auctions.yahoo.fr<br>
19) auktionen.yahoo.de<br>
20) av.yahoo.co.uk<br>
21) av.yahoo.de<br>
22) av.yahoo.fr<br>
</font> </td></tr></table>';

my @a = map {/\d+\)\s*(.+)\s*<br>/g} $d;

print Dumper \@a;
\n\n

<!--EDIT|vayu|1179995734-->
Linuxer
 2007-05-24 13:40
#76868 #76868
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
@vayu

Code: (dl )
my @a = map {/\d+\)\s*(.+)\s*<br>/g} $d;


Hä? was soll das map da bringen?

$d ist ein Skalar mit einem String; auf diesen String wird der Block des map einmal angewendet ...

Warum also nicht:

Code: (dl )
my @a = $d =~ m/\d+\)\s*(.+)\s*<br>/g;


Bitte um Aufklärung.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
vayu
 2007-05-24 14:18
#76869 #76869
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
ehrlich gesagt weiss ich auch nicht genau wieso das funktioniert :P aber es funktioniert.

und ich mag die schreibweise mit dem doppelten = nicht :)\n\n

<!--EDIT|vayu|1180002147-->
Ronnie
 2007-05-24 14:58
#76870 #76870
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=vayu,24.05.2007, 12:18]ehrlich gesagt weiss ich auch nicht genau wieso das funktioniert :P aber es funktioniert.[/quote]
Wahrscheinlich ist eine Liste mit einem Element auch eine Liste. Ist trotzdem unschön, aber wenn es dir gefällt?!
Linuxer
 2007-05-24 16:04
#76871 #76871
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Jo, die Funktion zweifelte ich auch nicht an; mich irritierte der Code.
Wie Ronnie schon schrieb, eine Liste mit einem Element ist auch eine Liste...

Ich hatte mehr als persönliche Vorliebe dahinter vermutet, daher die Nachfrage.

Mir persönlich scheint die Kanone map etwas zu groß, um damit auf einen einzelnen Spatz (Skalar) $d zu schießen.

Code: (dl )
1
2
3
4
my @a = ();
while ( $d =~ m/\d+\)\s*(.+)\s*<br>/g ) {
push( @a, $1 );
}

Hat kein map und auch kein "= =~" ;o)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
schwabi
 2007-05-24 16:18
#76872 #76872
User since
2006-02-07
18 Artikel
BenutzerIn

user image
Mir gefällt die letzte Lösung von Linuxer am besten.

Allerdings ist die while Bedingung nicht ganz korrekt, da im jetzigen Fall die durchnummerierten Adressen allesamt im Index 0 des Arrays a landen, weil die RegEx zu gierig ist.

Code: (dl )
while ( $d =~ m/\d+\)\s*(.+?)\s*<br>/g ) {


Gruss schwabi #rs
Linuxer
 2007-05-24 16:40
#76873 #76873
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
das Problem dürfte aber nur auftauchen, wenn mehr als ein Eintrag pro Zeile steht, denn der Modifier /g reicht eigentlich nicht aus, um . (Punkt) auch auf \n zutreffen zu lassen.\n\n

<!--EDIT|Linuxer|1180010557-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2007-05-23 22:04.