Schrift
[thread]10467[/thread]

RegEx: optionale Matches an Subroutine weitergeben (Seite 2)

Leser: 1


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
Froschpopo
 2007-09-26 23:24
#100043 #100043
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
15
16
#!/usr/bin/perl

use strict;

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

$string = ~s!\[(.+?)\]!parse(map{split(/\s+(?=\w+$)/,$_)}split(/\s*=\s*/,$1))!gse;

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

print $string;


Ergibt:
4294967295

???
topeg
 2007-09-26 23:42
#100044 #100044
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ein Leerzeichen zu viel. So:
Code: (dl )
$string =~s!

nicht so;
Code: (dl )
$string = ~s!
Froschpopo
 2007-09-27 00:19
#100045 #100045
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Super!
Weiter gehts:

Code: (dl )
my $string = 'Das ist Martin: [LINK="http://www.test.de" TARGET=_blank]klick hier[/LINK]';

Nun haben wir einmal wie gehabt die Parameter im öffnenden Tag, einmal den Contentbereich und dann den schließenden Tag.
Nun stehe ich wieder vor der puren Ratlosigkeit.
Bisher haben wir nämlich nur Standalone-Tags behandelt die keinen schließenden Tag benötigen.
Nun, wie soll es weitergehen?
Mein Problem ist, dass ich einen Vater habe, der stinksauer ist weil er seine Webseite nicht wie in Word bearbeiten kann.
Er hat auch keine Lust sich die HTML-begriffe zu merken. Ich habe ihm hierzu schonmal ein komplettes Handbuch geschrieben (Selfhtml war zu kompliziert und umfangreich).
Mein Vater ist Unternehmer und hat keine Zeit sich in sowas einzuarbeiten. Deshalb will er alle HTML-Begriffe in Deutsch haben.
Nun könnte ich natürlich schlicht und einfach alle Deutschen durch die englischen übersetzen. Aber dann kommen wir wieder an den Punkt, dass viele Attribute in den Tags optionale Angaben sind. Ich bin total fertig mit den Nerven.
topeg
 2007-09-27 00:48
#100046 #100046
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Meinst du sowas?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;

sub parse_link {
# $_=~s/^['"]|["']$//gs for(@_);
my %params = @_;
print "$_ = ".$params{$_}."\n" for keys %params;
return '<a href='.$params{LINK}.'>'.$params{INHALT}.'</a>';
}


my $string = 'Das ist Martin: [LINK="http://www.test.de" TARGET=_blank]klick hier[/LINK]';
print $string."\n";

$string =~ s!\[(LINK.+?)\](.+?)\[/LINK\]!parse_link((map{split(/\s+(?=\w+$)/,$_)}split(/\s*=\s*/,$1)),'INHALT',$2)!gse;
print $string."\n";


Leg' mich jetzt aber schlafen. Schau Morgen früh noch mal vorbei.
Froschpopo
 2007-09-27 01:03
#100047 #100047
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Aber der Code parst ja jetzt wieder NUR den Link.
Ich habe nach wie vor auch noch StandAlone-Tags, wie z.b. <img>.
topeg
 2007-09-27 07:49
#100049 #100049
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
achso.
Du willst sowas:
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;

sub parse {
my %params = @_;
print "$_ = ".$params{$_}."\n" for keys %params; print "#####\n";
if(exists($params{BILD}))
{
unless (-e $params{BILD})
{
return "!!Unbekannte Datei!!";
}
}
elsif(exists($params{LINK}))
{
return '<a href='.$params{LINK}.'>'.$params{INHALT}.'</a>';
}
else
{ return "!!Unbekannter Befehl!!"}
}


my $string =
'
Das ist Martin: [LINK="http://www.test.de" TARGET=_blank]klick hier[/LINK] Sein Bild: [BILD=martin.gif NAME="asd ass as" NAME2=hallo]
Das ist Bärbel: [LINK="http://www.test.de" TARGET=_blank]klick hier[/LINK] Ihr Bild: [BILD=baerbel.gif NAME="asd ass as" NAME2=hallo]
';
print $string."\n#####\n";

$string =~ s!\[((\w+).+?)\](?:(.+?)\[/\2\])?!parse((map{split(/\s+(?=\w+$)/,$_)}split(/\s*=\s*/,$1)),$3?('INHALT',$3):())!gse;
print $string."\n";
Froschpopo
 2007-09-28 06:19
#100095 #100095
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Das ist sehr sehr gut und funktioniert sogar!
Aber jetzt habe ich noch letztes Problem mit folgenden Alleinstehenden-Tags:
Code: (dl )
1
2
3
4
5
6
7
[ZITAT]Dies ist ein Zitat[/ZITAT]

oder:

[HEADLINE]Dies ist eine Überschrift[/HEADLINE]

usw.


Das sind Tags, denen kein Wert zugeordnet wird, die aber trotzdem Parameter enthalten dürfen, wie folgendes Bsp. zeigt:
[HEADLINE SIZE=3]text[/HEADLINE]
topeg
 2007-09-28 23:56
#100152 #100152
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das sollte Funktionieren:
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
34
35
36
37
38
39
40
41
#!/usr/bin/perl

use strict;
use warnings;

sub parse
{
my %params = @_;
# my @l=@_; print join('|',@l)."\n----\n";
print "$_ = ".$params{$_}."\n" for keys %params; print "#####\n";
if(exists($params{BILD}))
{ return '<img src='.$params{BILD}.'>'; }
elsif(exists($params{LINK}))
{ return '<a href='.$params{LINK}.'>'.$params{INHALT}.'</a>'; }
elsif(exists($params{ZITAT}))
{ return '<pre>'.$params{INHALT}.'</pre>'; }
elsif(exists($params{HEADLINE}))
{ return '<h>'.$params{INHALT}.'</h>'; }
else
{ return "!!Unbekannter Befehl!!"}
}

sub rsplit
{
my @v=@_;
# print join('|',@v),"\n";
return ($v[2]!~/=/?($v[1],''):(),$v[4]?('INHALT',$v[4]):(),$v[3]?(map{split(/\s+(?=\w+$)/,$_)}split(/\s*=\s*/,$v[2]=~/=/?$v[0]:$v[3])):());
}

my $string =
'
Das ist Martin: [LINK="http://www.test.de" TARGET=_blank]klick hier[/LINK] Sein Bild: [BILD=martin.gif NAME="asd ass as" NAME2=hallo]
Das ist Bärbel: [LINK="http://www.test.de" TARGET=_blank]klick hier[/LINK] Ihr Bild: [BILD=baerbel.gif NAME="asd ass as" NAME2=hallo]
[ZITAT]Dies ist ein Zitat[/ZITAT] oder:
[HEADLINE]Dies ist eine Überschrift[/HEADLINE]
[HEADLINE SIZE=3]text[/HEADLINE]
';
print $string."\n#####\n";

$string =~ s|\[((\w+)(\s*=?s*)(.*?))\](?:(.+?)\[/\2\])?|parse(rsplit($1,$2,$3,$4,$5?$5:''))|gse;
print $string."\n";

Aber etwas ist seltsam. Wenn ich den Code aus 'rsplit' in die Regexp setze (und die Variablen $1..$5 anpasse) so funktioniert es in sofern nicht, als $5 nicht korrekt als leer oder gefüllt erkannt wird (mal funktioniert es mal nicht).
Aber so wie es da jetzt steht funktioniert es.

Sind dir in der Zwischenzeit noch ein paar Features eingefallen die noch Fehlen? ;-)
Froschpopo
 2007-09-29 01:39
#100154 #100154
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Aber wir sollten vorher checken, warum das nicht zuverlässig funktioniert.
hast du herausgefunden WANN dieser Zufall eintritt?
Es verwirrt mich wenn wir eine neue Funktion einfügen und die alte funktioniert nicht fehlerfrei. Dann fällt wegen des vielen Textes die Fehleranalyse schwerer.

Anbei will ich dir mal zeigen was ich daraus gemacht habe:
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
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/perl

use strict;
use warnings;

my $body = "Das ist [BILD=margin.gif] und seine Homepage ist [LINK=http://www.martin.de]hier[/LINK]\n";

$body =~ s!\[((\w+).+?)\](?:(.+?)\[/\2\])?!allocate((map{split(/\s+(?=\w+$)/,$_)}split(/\s*=\s*/,$1)),$3?('INHALT',$3):())!gse;

sub allocate {
my %params = @_;
if (exists($params{BILD})) {
return &image(\%params);

} elsif (exists($params{LINK})) {
return &link(\%params);

} elsif (exists($params{HEADLINE})) {
return &headline(\%params);

} else {
return "!!Unbekannter Befehl!!"
}
}

sub image {
my $args = shift;
my $file = $args->{BILD};

chdir("/srv/www/seite/images/")
or die "Order nicht gefunden";
if (-e $file) {
my $text = $args->{TEXT};
my ($width, $height) = imgsize($file);
my $html = "<p class=\"bildabsatz\"><img src=\"/images/$file\" width=\"$width\" height=\"$height\"> <span>$text</span><p>\n";
return $html;
} else {
return "Bild nicht gefunden";
}
}

sub link {
my $args = shift;
return "<a href=\"$args->{LINK}\">$args->{INHALT}</a>";
}
topeg
 2007-09-29 01:54
#100155 #100155
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Die Regexp ist schlecht gebaut. Ich werde mich am Wochenende nochmal damit beschäftigen. Ich vermute Meine Konstruktion ist so ungewöhnlich, dass der RegexpParser durch einander kommt. Die Stelle "(?:(.+?)\[/\2\])?" macht Probleme. Das ist auch "$5".
Im Augenblick weiß ich nicht wie ich es anders lösen soll.
Sobald die Auswertung im Ersetzungsteil zu Komplex wird verliert $5 seinen Inhalt.

Aber so wie es jetzt da steht Funktionierte es definitiv korrekt und ohne Probleme.

Die Regexp in deinem Script Funktioniert. Das ist eine ältere Variante, dessen Auswertung noch nicht so Komplex ist. Wie ich schon sagtee, wenn du meinen Code übernimmst, funktioniert sie. Nur wenn du versuchst den inhalt der Funktion "rsplit" in die Regexp zu übernehmen spinnt sie.
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



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