Thread Regulären Ausdruck als Übergabe aus Formular (26 answers)
Opened by Gast at 2005-05-04 14:27

Dubu
 2005-05-06 01:50
#54594 #54594
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Die Schleife kann schon mal weg:
Code: (dl )
1
2
$string =~ s/$find/$subs/;
$output = $string;


Wenn der Benutzer auch noch Flags z.B. fuer "ignore case" angeben soll, dann kann man, wie pKai schon beschrieben hat, das in die Such-Regex aufnehmen:
Code: (dl )
1
2
3
4
5
6
7
8
my $schalter = '';
$schalter .= 'i' if $cgi->param('schalter_grossklein');
$schalter .= 's' if $cgi->param('schalter_punkt_matcht_newline');
if ($schalter) {
   $find = "(?$schalter)" . $find;
}

$string =~ s/$find/$subs/;

Das gilt aber nur fuer /i, /s, /m und /x. Uebrig bleiben die Modifier /g (fuer globales Suchen/Ersetzen), /o (Suche optimieren) und /x (Whitespace und Kommentare erlauben). Es macht eigentlich nur fuer /g Sinn, variabel zu sein, aber dann wuerde ich statt des eval (gefaehrlich mit Benutzereingaben! ) einfach eine Fallunterscheidung machen:
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
#!/usr/bin/perl
use strict;
use warnings;
use CGI;

# neues CGI-Objekt anlegen
my $cgi = new CGI;

# Formulardaten einlesen
my $find = $cgi->param('such');
my $subs = $cgi->param('ersetz');
my $string = $cgi->param('eingabe');

# Schalter aus Formular auswerten
my $schalter = '';
$schalter .= 'i' if $cgi->param('schalter_grossklein');
$schalter .= 's' if $cgi->param('schalter_punkt_matcht_newline');

# Wenn einer der Schalter gesetzt ist, vor Regexp setzen
if ($schalter) {
   $find = "(?$schalter)" . $find;
}

# Wenn schalter_global, dann mit /g
if ($cgi->param('schalter_global')) {
   $string =~ s/$find/$subs/g;
} else {
   $string =~ s/$find/$subs/;
}

# Loesungsseite ausgeben
print $cgi->header, $cgi->start_html,
     $cgi->h1("Lösung"), $cgi->p($string),
     $cgi->end_html;

# ENDE

View full thread Regulären Ausdruck als Übergabe aus Formular