User since
2003-09-20
470
Artikel
BenutzerIn
Hallo,
Ich möchte einen String vergleichen ob er z.B. genau auf "webmaster" passt (genau auf das Wort), das klappt auch. Die RegEx sieht so aus:
if ($string =~ /^$name[1]$/i)
Wenn aber die Variable $name den Wert "*webmaster*" enthält, so soll die RegEx auch bei 123webmaster123 usw. anschlagen.
Wie kann ich das lösen???
Danke
Tom
User since
2003-08-04
12208
Artikel
Admin1
dann musst du die sternchen in perl-wildcards umwandeln:
$name[1] =~ s/\*/.*/g;
User since
2003-09-20
470
Artikel
BenutzerIn
Wenn ich das vor den Vergleich setze funktioniert das auch nicht.
Tom
User since
2003-08-04
12208
Artikel
Admin1
aha, mal wieder einer mit einem kaputten perl.
meins (5.8.3, linux) macht, was es soll:
$ perl -wle'
$string = "123webmaster123";
$name = "*webmaster*";
$name =~ s/\*/.*/g;
if ($string =~ m/^$name$/i) {
print qq{"$string" matches "$name"}
}'
"123webmaster123" matches ".*webmaster.*"
$
User since
2003-08-21
2614
Artikel
ModeratorIn
Du musst bei so etwas verdammt aufpassen, wenn Du es in CGI-Skripten benutzt. Denn wenn ein eingebetteter RE einen Syntaxfehler beinhaltet, kann damit das Programm abgebrochen werden:
$ perl -e 'my $re = "(broken"; "hallo" =~ /$re/;'
Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE broken/ at -e line 1.
Ich nehme mal an, dass $name etwas ist, was vom User eingegeben wird. So etwas sollte nie in einem Regulaeren Ausdruck auftauchen (es sei denn, hinter \Q, siehe perldoc perlre).
Als "sichere" Loesung fuer Dein Problem wuerde ich vorschlagen:
my $begin = $name =~ s/^\*// ? qr// : qr/^/;
my $end = $name =~ s/\*$// ? qr // : qr/$/;
if ($string =~ /$begin\Q$name\E$end/) {
...
}
User since
2003-09-20
470
Artikel
BenutzerIn
[quote=betterworld,15.07.2004, 22:44]Als "sichere" Loesung fuer Dein Problem wuerde ich vorschlagen:
my $begin = $name =~ s/^\*// ? qr// : qr/^/;
my $end = $name =~ s/\*$// ? qr // : qr/$/;
if ($string =~ /$begin\Q$name\E$end/) {
...
}
[/quote]
Das funktioniert aber auch nicht.
In die Variable $beginn schreibt Perl "(?-xism:^)" ist das so richtig???
Ich brauche das für ein CGI-Script, außerdem verwende ich noch Perl 5.6.1 (Windows)
Tom
User since
2003-08-21
2614
Artikel
ModeratorIn
[quote=Tom,16.07.2004, 19:00]Das funktioniert aber auch nicht.[/quote]
Ich habe den Code doch getestet. Zeig doch mal, was Du fuer "..." eingesetzt hast und was bei Dir $name und $string ist.
In die Variable $beginn schreibt Perl "(?-xism:^)" ist das so richtig???
Ja, das ist ok. Das liegt daran, dass die Variable kein String sondern ein Regulaerer Ausdruck ist (deswegen qr und nicht qq). Ich weiss auch grad nicht, wofuer xism genau steht, aber bei mir steht das auch, wenn ich es printe.
User since
2003-08-21
2614
Artikel
ModeratorIn
Also, hier noch mal das ganze Skript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;
my @names = qw/webmaster *webmaster webmaster*/;
for my $string (qw/Alfred webmaster wwwebmaster webmasters/) {
for (0..$#names) {
my $name = $names[$_];
print "$name matcht auf $string ";
my $begin = $name =~ s/^\*// ? qr// : qr/^/;
my $end = $name =~ s/\*$// ? qr// : qr/$/;
if ($string =~ /$begin\Q$name\E$end/) {
print "sehr gut.";
} else {
print "nicht.";
}
print "\n";
}
}
Ausgabe davon ist:
webmaster matcht auf Alfred nicht.
*webmaster matcht auf Alfred nicht.
webmaster* matcht auf Alfred nicht.
webmaster matcht auf webmaster sehr gut.
*webmaster matcht auf webmaster sehr gut.
webmaster* matcht auf webmaster sehr gut.
webmaster matcht auf wwwebmaster nicht.
*webmaster matcht auf wwwebmaster sehr gut.
webmaster* matcht auf wwwebmaster nicht.
webmaster matcht auf webmasters nicht.
*webmaster matcht auf webmasters nicht.
webmaster* matcht auf webmasters sehr gut.
Wenn bei Dir etwas anderes rauskommt, Tom, dann ist Dein Perl wohl wirklich kaputt ;-)
Beachte, dass die Variable $name veraendert wird hierbei. Man sollte sie also hinterher nicht wiederverwenden.\n\n
<!--EDIT|betterworld|1089999035-->
User since
2003-11-28
3645
Artikel
ModeratorIn
[quote=betterworld,16.07.2004, 19:13]Ja, das ist ok. Das liegt daran, dass die Variable kein String sondern ein Regulaerer Ausdruck ist (deswegen qr und nicht qq). Ich weiss auch grad nicht, wofuer xism genau steht, aber bei mir steht das auch, wenn ich es printe.[/quote]
-xism bedeutet, dass die Regexp-Flags x, i, s und m ausgeschaltet sind. Wenn beispielsweise die "auessere" Regexp per /.../i case-insensitive arbeitet, dann ist die "innere" Regexp trotzdem noch case-sensitive.
User since
2003-08-04
12208
Artikel
Admin1