Schrift
[thread]6960[/thread]

Regulären Ausdruck als Übergabe aus Formular (Seite 3)



<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten
Crian
 2005-05-05 03:15
#54590 #54590
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Wenn man aber ersetzen will, muss man es wohl so machen, wie ich es oben gepostet habe. Es sei denn, man gibt Such und Ersatztext in zwei getrennten Feldern im Formular an.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pKai
 2005-05-05 13:58
#54591 #54591
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
@Crian: Dass der OP da irgendwas mit s/// machen will, ist aber ein Postulat von dir.
Das wäre zwar eine mögliche Interpretation der spärlichen Angaben, aber ...
Wie Dubu aber schon sagte: Zum anderen ist mir immer noch unklar, was das Programm tatsaechlich ausgeben soll.
Das Beste was wir dazu bisher gehört haben vom OP ist
Quote
"für jede Eingabe aus Formularfeld1 also gespeichert in $String, wende einen regulären Ausdruck an, welcher in $regexstring steht."
Da er das selber in Anführungstriche gesetzt hat, nehme ich mal an (sic! ), dass das nichtmal seine eigenen Worte sind, mehr so ne Art Hausaufgabe vielleicht?
Fragen über Fragen...\n\n

<!--EDIT|pKai|1115287248-->
I sense a soul in search of answers.
Gast Gast
 2005-05-06 00:21
#54592 #54592
Ja hallo allesamt - danke für die vielen posts,

ich habe das jetzt tatsächlich über mehrere Eingabefelder gelöst und der Quellcode sieht jetzt so aus:
foreach ($string)
{
s/$find/$subs/;
}
$output = $string;
und es funzt soweit auch, nur eine Sache wär da noch....
Wenn ich das ganze um ein Eingabefeld für den Flag am Ende der RegEx erweitere und es dann in der Form
s/$find/$subs/$flag;
in den code miteinbaue gibt es eine Fehlermeldung bzw. er nimmt es nicht an...:p
pKai
 2005-05-06 00:41
#54593 #54593
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Die Begrenzer (/) in s/// sind sowas wie Anführungszeichen inerhalb denen perl seine Variablen einsetzt ("interpoliert").
Für die Modifikatoren geht das nicht.
Wenn der Anwender gewieft ist kann er die Modifikatoren in der Form "(?i)suche" (= suche "suche" wie mit /i Case-insensitive) angeben.
Ansonsten müsstest du eval verwenden. (siehe oben)
I sense a soul in search of answers.
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
betterworld
 2005-05-06 02:24
#54595 #54595
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Dubu,05.05.2005, 23:50]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).[/quote]
Das von Dir zweifach genannte /x ist tatsaechlich auch ueber die Methode mit "(?x)" realisierbar, auch wenn es fraglich ist, dass Leute ueber CGI Kommentare einspeisen moechten.
Strat
 2005-05-09 20:15
#54596 #54596
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
kommentare? wohl eher nicht... aber vielleicht die RE schoener formatieren?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten



View all threads created 2005-05-04 14:27.