Schrift
[thread]5809[/thread]

Regex Problemchen



<< >> 8 Einträge, 1 Seite
Heromaster
 2003-10-08 14:24
#62136 #62136
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich versuche mich nun schon seit Stunden an einer Regex, aber ich bekomme es einfach nicht hin :(.

Code: (dl )
1
2
3
4
5
6
my $tmp;
$entry =~ s/(\[email\]|\[email=(.*)\])(.*)\[\/email\](?!\[\/email\])(?{ if(!defined($2) or $2 eq '') {$tmp = $3 }else{ $tmp = $2 } })/<a href=\"mailto:$tmp\">$3<\/a>/ig;
print "Ich bin 1 $1<br>";
print "Ich bin 2 $2<br>";
print "Ich bin 3 $3<br>";
print $tmp;


Wenn $entry == meine@home.de ist, bekomme ich also Ergebnis korrekt <a href="mailto:meine@home.de">meine@home.de</a>
Ist $entry allerdings Meine Email dann erscheint als Ergebnis <a href="mailto:">Meine Email</a>
Drehe ich die Bedingung im Code-Block der Regex um, also aus:
Code: (dl )
])(?{ if(!defined($2) or $2 eq '') {$tmp = $3; }else{ $tmp = $2; } })

wird
Code: (dl )
])(?{ if $2 ne '') {$tmp = $2; }else{ $tmp = $3; } })

dann ist die Ausgabe von $entry auch umgedreht.
Scheinbar wird der else-Zweig ignoriert, da  $2 & $3 korrekt sind. Oder sieht vielleicht jemand einen Fehler, den ich nicht sehe?\n\n

<!--EDIT|Heromaster|1065608764-->
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
Relais
 2003-10-08 15:18
#62137 #62137
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
weiß nicht, was Du für ein Perl hast, aber meins sagt syntax error.

Der Perl-Code ist wirr (und ganz falsch).
Beschreib doch mal in Worten, was Du vor hast!

Dann kann man da auch vielleicht Perl Code draus machen.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Heromaster
 2003-10-08 15:36
#62138 #62138
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Bei mir läuft die Regex bis auf das beschriebene Problem auf Perl 5.6.1 unter Win32 reibungslos.

Ich bin gerade dabei ein BB-Code-Parser zu basteln. Beim [email]-code soll auf 2 Varianten in einer Regex geprüft werden. Der Tag kann also folgendermassen aussehen:
1. [email=meine@home.de]Meine Email[../email]
oder 2. [email]meine@home.de[../email]

Dadurch bin ich zu folgender Regex gekommen :
$entry =~ s/(\[email\]|\[email=(.*)\])(.*)\[\/email\](?!\[\/email\])(?{ if(!defined($2) or $2 eq '') {$tmp = $3 }else{ $tmp = $2 } })/<a href=\"mailto:$tmp\">$3<\/a>/ig;
Der fettmarkierte Teil ist der Code, der inerhalb der Regex ausgeführt wird und nicht korrekt funktioniert. Wie gesagt drehe ich die if-Bedingung um tritt bei $entry auch der umgekehrte Fall ein (siehe 1. Posting). Ich weiß, das ich das auch einfacher in zwei Regexen erledigen kann, da aber Perl mir das Feature anbietet, Perl-Code innerhalb einer Regex auszuführen, habe ich mich für diese Variante entschieden. Ich weiß, ich bin schlecht und werde dafür in der Hölle schmoren ;)
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
pq
 2003-10-08 15:52
#62139 #62139
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Heromaster,08.10.2003, 12:24]Wenn $entry == meine@home.de ist, bekomme ich also Ergebnis korrekt <a href="mailto:meine@home.de">meine@home.de</a>[/quote]
da werden sich die betreiber von home.de aber freuen, dass du ihre domain
als beispiel-adresse benutzt. jetzt bekommen sie ganz viel interessante post.
(bitte das nächste mal z.B. user@example.org oder user@domain.example
verwenden)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Strat
 2003-10-09 02:20
#62140 #62140
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Teste mal:
Code: (dl )
1
2
3
4
5
6
7
my $tag = 'email';
if ($string =~ s| \Q[$tag]\E (.+?) \Q[\/$tag]\E /<a href="mailto:$1">$1</a>|sigx) {
# ersetzt
}
elsif ( $string =~ s| \[\Q$tag=\E ([^]]+?)\] (.+?) \[/\Q$tag\E\] |<a href="mailto:$1">$2</a>|sigx ) {
# ersetzt 2
}
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Heromaster
 2003-10-15 13:55
#62141 #62141
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Genau dieses Konstrukt wollte ich vermeiden :)

Ich habe es mittlerweile so gelöst:
Code: (dl )
$entry =~ s/\[email(?:\=(.+?))?\](.+)\[\/email\]/"<a href=\"mailto:\"".eval($1 ? $1 : $2)."\">".$2."<\/a>"/ige
\n\n

<!--EDIT|Heromaster|1066284925-->
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
Relais
 2003-10-16 01:20
#62142 #62142
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Substitution replacement not terminated.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Heromaster
 2003-10-16 10:15
#62143 #62143
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Hab meinen Beitrag editiert, scheinbar ist etwas beim copy & paste nicht alles kopiert wurden.
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
<< >> 8 Einträge, 1 Seite



View all threads created 2003-10-08 14:24.