Schrift
[thread]10467[/thread]

RegEx: optionale Matches an Subroutine weitergeben

Leser: 1


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
Froschpopo
 2007-09-25 23:57
#99990 #99990
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Folgender String:
Code: (dl )
[BILD:test.gif PARAMETER1:wert PARAMETER2:wert]


Nun möchte ich daraus folgendes machen:
<img src="test.gif" PARAMETER1="wert" PARAMETER2="wert">
usw.

Dazu habe ich folgenden RegEx:
Code: (dl )
$string =~ s/\[BILD:(.+)\]/bild($1)/ge


Nun möchte ich es aber so haben, dass alle Parameter auch an bild() übergeben werden und zwar unabhängig von der Anzahl der Parameter.
Am liebsten als Hashreferenz:
Code: (dl )
$string =~ s/\[BILD:(.+)\]/bild(\%parameter)/ge;

Hat jemand von euch eine Idee, wie ich aus den Wertepaaren (z.B. BILD:wert) ein anonymes Hash erzeuge und an bild() übergeben kann?

Sodass ich dann später folgendes machen kann:
Code: (dl )
1
2
3
4
sub bild {
my $hashref = shift;
print "Bild: $hashref->{BILD}\n";
}
esskar
 2007-09-26 08:40
#99997 #99997
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
my @values = $string =~ m!\[(([\w]+)\s*:\s*([\w\d\.]+))+\]!g;
&bild(@values) if scalar @values;


(ungetest)
Froschpopo
 2007-09-26 22:08
#100028 #100028
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
habs getestet:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;

my $string = "Das ist Martin: [BILD=martin.gif]";

my @values = $string =~ m!\[(([\w]+)\s*=\s*([\w\d.]+))+\]!g;

&parse(@values) if scalar @values;

sub parse {
my @args = @_;
print "Parameter:\n";
print $_."\n" for @args;
}

Fazit: Funktioniert leider nur mit einem Parameter.
Wenn ich [BILD=martin.gif BREITE=300] angebe, erkennt er es nicht mehr.

Ansonsten scheint mir das ganze aber ein guter Anfang zu sein!

PS: wie du siehst, habe ich : durch = ersetzt.
topeg
 2007-09-26 22:12
#100029 #100029
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
ändere es mal so:
Code (perl): (dl )
my @values = $string =~ m!\[(?:(\w+?)\s*=\s*(.+?)\s*)+\]!gs;
Froschpopo
 2007-09-26 22:18
#100030 #100030
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use strict;

my $string = "Das ist Martin: [BILD=martin.gif NAME=test NAME2=hallo]";

my @values = $string =~ m!\[(?:(\w+?)\s*=\s*(.+?)\s*)+\]!gs;

&parse(@values) if scalar @values;

sub parse {
my %params = @_;
print $_ . " = ".$params{$_}."\n" for keys %params;
}

Jetzt zeigt er immer den letzten Parameter an, also:
Code: (dl )
NAME2 = hallo
topeg
 2007-09-26 22:30
#100033 #100033
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Dann versuchen wir es mal so:
Code (perl): (dl )
my @values = split(/\s*=\s*|\s+/, ($string =~ m!\[(.+?)\]!s)[0]);
Froschpopo
 2007-09-26 22:32
#100034 #100034
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Sehr schick!! Jetzt funktioniert es! Du bist ein wahrer Könner ;)

Jetzt noch eine Kleinigkeit:

Ich möchte gern Leerzeichen, etwa bei einer Description einsetzen können:
Code: (dl )
[BILD=martin.gif ALT="hier sehen wir Martin" BREITE=300]
topeg
 2007-09-26 22:54
#100037 #100037
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Na dann halt so. :-)
Code (perl): (dl )
my @values = map{split(/\s+(?=\w+$)/,$_)}split(/\s*=\s*/, ($string =~ m!\[(.+?)\]!s)[0]);
Froschpopo
 2007-09-26 23:02
#100039 #100039
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Super, funktioniert auch.
Aber nun eine neue Problematik:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

use strict;

my $string = 'Das ist Martin: [BILD=martin.gif NAME="asd ass as" NAME2=hallo]';

my @values = map{split(/\s+(?=\w+$)/,$_)}split(/\s*=\s*/, ($string =~ m!\[(.+?)\]!s)[0]);

&parse(@values) if scalar @values;

sub parse {
my %params = @_;
unless (-e $params{BILD}) {
return "File not found\n";
}
}

Eigentlich wollte ich in parse() ein HTML-Tag erzeugen und an den Ursprung zurückgeben.
Das ist mit einem Matching natürlich nicht möglich.
topeg
 2007-09-26 23:11
#100041 #100041
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
so:
Code (perl): (dl )
$string=~s!\[(.+?)\]!parse(map{split(/\s+(?=\w+$)/,$_)}split(/\s*=\s*/,$1))!gse;
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



View all threads created 2007-09-25 23:57.