Regulären Ausdruck checken
Christoph Schnauß
- perl
hallo Forum,
ich laboriere an einem Regulären Ausdruck herum, der "eigentlich" ziemlich einfach ist:
if ($name =~ /[^a-zA-ZäöüÄÖÜß ]/)
Es soll bei einem Formular außer Buchstaben und deutschen Umlauten sowie einem Leerzeichen nichts anderes als Eingabe zugelassen werden.
Das Problem ist nun, daß mein Script so freundlich ist, die Umlaute nach ü usw. umzuwandeln, womit dann, obwohl ich das gar nicht im Formular stehen habe, ein "unerlaubtes" Zeichen von diesem Ausdruck bewertet wird. Ich könnte das umgehen, indem ich
if ($name =~ /[^a-zA-ZäöüÄÖÜß&; ]/)
oder
if ($name =~ /[^a-zA-ZäöüÄÖÜß \S]/)
schreibe. Aber damit wären auch wieder Eingaben der beiden Zeichen & und ; bzw. von Zeichen, die "kein Leerzeichen oder Steuerzeichen sind" im entsprechenden Formularfeld möglich, und das soll nicht sein.
Wie löse ich dieses Dilemma?
Grüße aus Berlin
Christoph S.
Wie löse ich dieses Dilemma?
Naja, indem du die Eingabe vor dem Umwandeln prüfst.
Oder, noch einfacher, du wandelst die Umlaute gar nicht um, zumal es bei Verwendung des richtigen Charsets nicht nötig ist (http://dciwam.de/faq/html/entities).
Struppi.
hallo Struppi,
Wie löse ich dieses Dilemma?
Naja, indem du die Eingabe vor dem Umwandeln prüfst.
Das kriege ich nicht hin, weil ich meine RegExpressions (es gibt noch ein paar mehr) in ein Modul ausgelagert habe, und das muß ich mit "use" ins Script einbinden. Ich könnte höchstens mit den Variablennamen herumspielen.
Oder, noch einfacher, du wandelst die Umlaute gar nicht um, zumal es bei Verwendung des richtigen Charsets nicht nötig ist (http://dciwam.de/faq/html/entities).
Björn H. ist mir ein Begriff, diese Seite wars bisher nicht. Mag sein, daß das tatsächlich mit "einfach Weglassen" ausreicht. Es muß aber vor vier oder fünf Jahren, als ich das Script mal "erfunden" habe, sinnvoll gewesen sein, diese Umwandlungen zu machen.
Grüße aus Berlin
Christoph S.
Wie löse ich dieses Dilemma?
Naja, indem du die Eingabe vor dem Umwandeln prüfst.Das kriege ich nicht hin, weil ich meine RegExpressions (es gibt noch ein paar mehr) in ein Modul ausgelagert habe, und das muß ich mit "use" ins Script einbinden. Ich könnte höchstens mit den Variablennamen herumspielen.
Das versteh ich nicht, d.h. du bearbeitest die Eingabe vor dem Programmstart?
Kein normales vorgehen wie ich finde.
Oder, noch einfacher, du wandelst die Umlaute gar nicht um, zumal es bei Verwendung des richtigen Charsets nicht nötig ist (http://dciwam.de/faq/html/entities).
Björn H. ist mir ein Begriff, diese Seite wars bisher nicht. Mag sein, daß das tatsächlich mit "einfach Weglassen" ausreicht. Es muß aber vor vier oder fünf Jahren, als ich das Script mal "erfunden" habe, sinnvoll gewesen sein, diese Umwandlungen zu machen.
Die FAQ der newsgroup ist relativ neu.
Wahrscheinlich hasst du früher keinen Charset definiert oder dir waren die Möglichkeiten nicht bekannt.
Struppi.
hallo Struppi,
Das kriege ich nicht hin, weil ich meine RegExpressions (es gibt noch ein paar mehr) in ein Modul ausgelagert habe, und das muß ich mit "use" ins Script einbinden
Das versteh ich nicht, d.h. du bearbeitest die Eingabe vor dem Programmstart?
Kein normales vorgehen wie ich finde.
Die Anmerkung war zu erwarten ;-)
Ich habe tatsächlich heftig über den Sinn einer solchen Auslagerung nachgegrübelt. Aber da alles über if/else und/oder "if exists" läuft, geht das schon. Je nach Aufruf einer Subroutine existieren Formularfelder inclusive zugehöriger Variablen und Parameter, oder sie existieren eben nicht. Ich wollte alle meine RegExpressions einigermaßen übersichtlich zusammen haben.
Wahrscheinlich hasst du früher keinen Charset definiert oder dir waren die Möglichkeiten nicht bekannt.
Beides trifft zu.
Grüße aus Berlin
Christoph S.
Hallo Christoph.
Wie löse ich dieses Dilemma?
Spricht etwas dagegen, die Strings zuvor mit HTML::Entities zu bearbeiten?
Freundschaft!
Siechfred
gudn tach!
was spricht gegen folgendes?
if($name=~/^(&[aouAOU]uml;|ß|[a-zA-ZäöüÄÖÜß ])+$/){
# rischdisch
}else{
# falsch
}
prost
seth
hallo seth,
was spricht gegen folgendes?
if($name=~/^(&[aouAOU]uml;|ß|[a-zA-ZäöüÄÖÜß ])+$/)
Das ergibt eine Fehlermeldung, und zwar eine der wenigen, die ich immer noch nicht zu deuten vermag:
Use of uninitialized value in join or string at (eval 15) line 15
Es ist dieses "eval", das ja auf einen Fehler verweist, der mit "Zeile 15" gar nichts zu tun haben muß. Wenn ich die angemeckerte Stelle finden könnte, wäre es möglich, das "uninitialized" auch zu beheben.
Das ändert nichts daran, daß die Idee erstmal plausibel klingt.
Grüße aus Berlin
Christoph S.
gudn tach Christoph!
if($name=~/^(&[aouAOU]uml;|ß|[a-zA-ZäöüÄÖÜß ])+$/)
Das ergibt eine Fehlermeldung, und zwar eine der wenigen, die ich immer noch nicht zu deuten vermag:
Use of uninitialized value in join or string at (eval 15) line 15
Es ist dieses "eval", das ja auf einen Fehler verweist, der mit "Zeile 15" gar nichts zu tun haben muß.
trotzdem: was steht denn in zeile 15? (und was steht davor?) ist der kram zu sehr verflechtet oder kannst du code-auszuege praesentieren?
(oder ist es evtl. moeglich, dass dein problem etwas zu tun hat hiermit?)
prost
seth
hallo,
trotzdem: was steht denn in zeile 15? (und was steht davor?)
Zeilen 10 bis 15 sehen so aus:
#############################
## gemeinsamer Dateikopf
$temp_kopf = $cgi->header().
$cgi->start_html(-title =>'temporäre Anzeige', -style =>{'src'=>$css})."\n";
Das einzige, was hier "evaluiert" wird, ist die CSS, und nicht (noch nicht) irgendein Formularfeld. und noch weiter oben stehen lediglich die shebang und ein weiterer Kommentar. Die Fehlermeldung bekomme ich auch nur, wenn ich deinem Vorschlag folge.
(oder ist es evtl. moeglich, dass dein problem etwas zu tun hat hiermit?)
Sehr unwahrscheinlich, ich denke, ich habe das jetzt gründlich gelesen.
Grüße aus Berlin
Christoph S.
Hallo Christoph Schnauß
hallo seth,
was spricht gegen folgendes?
if($name=~/^(&[aouAOU]uml;|ß|[a-zA-ZäöüÄÖÜß ])+$/)Das ergibt eine Fehlermeldung, und zwar eine der wenigen, die ich immer noch nicht zu deuten vermag:
Use of uninitialized value in join or string at (eval 15) line 15
Die Fehlermeldung erhälst du in der Regel vom CGI Modul. Da dort die Funktionen erst zur Laufzeit eingebunden werden kommt es zu den Fehlermeldungen. Du hast irgendwo in deinem Skript einen Aufruf einer CGI Funktion mit einem undefinierten Wert.
Es hat aber mit grosser Sicherheit nichts mit dem obigen Ausdruck zu tun (in der Annahme, dass in $name auf jeden Fall ein definierter wert steht).
Struppi.
hi,
Use of uninitialized value in join or string at (eval 15) line 15
Die Fehlermeldung erhälst du in der Regel vom CGI Modul. [...] Du hast irgendwo in deinem Skript einen Aufruf einer CGI Funktion mit einem undefinierten Wert.
Die Fehlermeldung kommt vom CGI-Modul, ja. Nur nutzt mir in diesem Fall die "eval"-Angabe gar nix, weil ich damit keinen Hinweis bekomme, wo der "Fehler" steckt.
Es hat aber mit grosser Sicherheit nichts mit dem obigen Ausdruck zu tun
Doch. Weil diese Fehlermeldung _nur_ dann kommt, wenn ich den Vorschlag von seth realisiere. In Zeile 15 wird aber meine Formular-Variable gar nicht angesprochen, sondern eine andre. Und die steht nicht einmal in meinem "RegExpressions-Modul"
(in der Annahme, dass in $name auf jeden Fall ein definierter wert steht)
Das tut er, und selbst wenn er 0 oder "leer" sein sollte, ist er ja definiert.
Grüße aus Berlin
Christoph S.
Use of uninitialized value in join or string at (eval 15) line 15
Die Fehlermeldung erhälst du in der Regel vom CGI Modul. [...] Du hast irgendwo in deinem Skript einen Aufruf einer CGI Funktion mit einem undefinierten Wert.Die Fehlermeldung kommt vom CGI-Modul, ja. Nur nutzt mir in diesem Fall die "eval"-Angabe gar nix, weil ich damit keinen Hinweis bekomme, wo der "Fehler" steckt.
Genau das ist das PRoblem von eval, aber das CGI Modul arbeitet nunmal damit.
Es hat aber mit grosser Sicherheit nichts mit dem obigen Ausdruck zu tun
Doch. Weil diese Fehlermeldung _nur_ dann kommt, wenn ich den Vorschlag von seth realisiere. In Zeile 15 wird aber meine Formular-Variable gar nicht angesprochen, sondern eine andre. Und die steht nicht einmal in meinem "RegExpressions-Modul"
Die Zeile 15 ist unrelevant, da es sich nicht um die Zeile mit dem Fehler handelt, es ist die Zeile 15 im eval Aufruf und diese ausfindig zu machen dürfte schwer werden.
Aber nichtsdestotrotz hast du in irgendeinen Aufruf einer Funktion des CGI Moduls eine undefinierte Variabel. Wenn das mit der RegEx zusammehnhängt muss die irgendwo danach sein.
(in der Annahme, dass in $name auf jeden Fall ein definierter wert steht)
Das tut er, und selbst wenn er 0 oder "leer" sein sollte, ist er ja definiert.
Naja, dann passiert also irgendetwas anderes wenn du die RegEx verwendest als wenn du sie nicht verwendest und genau sollte der Fehler zu finden sein, da die RegEx an sich ja funktioniert.
Struppi.