Beitrag von Jürgen (614 Beiträge) am Mittwoch, 13.August.2003, 14:07.
@Perl-Profis/ regex
Antworten
Beitrag von Sander (8133 Beiträge) am Mittwoch, 13.August.2003, 14:14.
Re: @Perl-Profis/ regex
Antworten
Beitrag von Jürgen (614 Beiträge) am Mittwoch, 13.August.2003, 22:11.
Re: @Perl-Profis/ regex
Hi Sander,
Danke vorab. Funzt soweit, aber wenn ich das Feld mit 2345gfgf übergebe,
wird es zugelassen. Es sollten nur Zahlen möglich sein.
hast du noch eine Tipp für mich ??
Danke.
Gruß
Jürgen
Antworten
Beitrag von hempelr (1976 Beiträge) am Donnerstag, 14.August.2003, 07:37.
Re: @Perl-Profis/ regex
Hallo, Jürgen,
mit meinem Regex-Unverstand würde ich es mit ner zweistufigen Transliteration machen, einmal auf Zahlen abfragen und einmal auf Wortzeichen und dann im Vergleich das eine auf Vorhandensein und das andere auf nicht Vorhandensein
Hier mal der getestete Codeabschnitt (müsste auch die Sonderzeichen erschlagen):
################################
# Zahlentest
$z1 = "123k5";
$z2 = "12345";
$z3 = "1238wert";
$z4 = "12\5\n rtz";
$z5 = "123 456";
$z6 = "a12bcd";
#
foreach ($z1,$z2,$z3,$z4,$z5,$z6){
$t = ($_ =~ tr/[0-9]//); # Anzahl der Ziffernzeichen
$bt =( $_ =~ tr/[a-zA-Z\W\s\w ]//); # Anzahl der anderen Zeichen
out "Wert ist: $_ / - ";
if ($t && !$bt ){
out "Anzahl Zahlzeichen: $t - Anzahl andere Zeichen: $bt - ";
out " Nur Zahlen <br>";}
else {
out "Anzahl Zahlzeichen: $t - Anzahl andere Zeichen: $bt - ";
out " Zahlen und Buchstaben <br>";}
}
################################
Kannst natürlich die Wertzuweisungen an $t und $bt gleich in der Abfrage zusammenfassen, wenn du die Werte nicht brauchts:
if ( $t = ($_ =~ tr/[0-9]//) && !$bt =( $_ =~ tr/[a-zA-Z\W\s\w ]//) ){
....
}
Hoffe es hilft dir
Ruben
Antworten
Beitrag von hempelr (1976 Beiträge) am Donnerstag, 14.August.2003, 07:40.
Sorry, "kleiner" Interpunktionsfehler: Re: @Perl-Profis/ regex
Antworten
Beitrag von Jürgen (614 Beiträge) am Donnerstag, 14.August.2003, 09:55.
Re: Sorry, "kleiner" Interpunktionsfehler: Re: @Perl-Profis/ regex
Antworten
Beitrag von hempelr (1976 Beiträge) am Donnerstag, 14.August.2003, 13:09.
Re: Sorry, "kleiner" Interpunktionsfehler: Re: @Perl-Profis/ regex
mhm - warte mal, du willst also nur die Eingabe überprüfen und wenn sie falsch ist eine spezielle Fehlermeldung in die Var $errmsg schreiben.
Alle anderen Aktionen regelst du dann über den Inhalt von $emsg ?
musste so gehen:
...
if ( $t = ($_put{Titelp} =~ tr/[0-9]//) || ($bt =( $_put{Titelp} =~ tr/[a-zA-Z\W\s\w ]//)) ){
$emsg.="Title: $Titelp enthält Sonderzeichen!<br>"
}
$emsg.="Title wurde nicht ausgefüllt<br>" if $_put{Titelp} eq "";
....
Kurz erklärt:
Die Transliteration ist eine "Sparvariante" von Regex und laut SelfHTML bedeutend schneller, weil die Regex-Maschine von Perl nicht erst initialisiert werden muss. Es wird dabei eine Zuweisung, besser austausch an die zu bearb. Var vom tr/linkenTeilstring// an den tr//rechtenTeilstring/ vorgenommen.
Wenn man aber nur schreibt $var =~ tr/linkerTeil/rechterTeil/ wird der Inhalt der Variable $var direkt verändert und steht dann nur mit der neuen Wertzuweisung zur Verfügung. Deshalb der Zuweisungs-"Kopier"-Ausdruck
$varneu = ($var =~ tr/linkerTeil/rechterTeil/), wobei hier das Ergebnis der Transliteration in $varneu steht und $var ihren ursprünglichen Inhalt unverändert beibehält. (ist aber auch auf alle Regulären Ausdrücke übertragbar, wo man nicht den Ursprungsvariableninhalt verändern will).
Der Konstrukt der Translit. von oben macht sich die Eigenart der Transliterationen zunutze, als Rückgabewert die Anzahl der gefundenen Übereinstimmungen zu nutzen (ist ja ne leere Translit, da kein Wert für den Ersetzungsstring auf der rechten Seite des Ausdrucks angegeben wurde). Deshalb erhält man hier immer einen Zahlwert, der dann direkt auswertbar ist.
Das eröffnet eine gute Möglichkeit, Strings auf Ihre Inhalte zu analysieren, man könnte bspw. nach versch. Zeichen bzw. Zeichengruppen suchen, die Ergebnisse der Anzahl in eine Liste Schreiben und sich für jeden Wert der Liste die Anzahl der Zeichen(gruppen) ausgeben lassen - ein optimaler Weg, um bspw. die Zahl der öffnenden und schließenden Klammern bzw. Geschweiften Klammern in nem Script zu zählen und zu vergleichen (man übergibt den Template-Inhalt einfach an die Funktion, indem man den Inhalt des Templates in ne Var schreibt und am Ende die Funktion ausführt und sich das Ergebnis anzeigen lässt)
So wäre es auch denkbar, die Ergebnisvariablen direkt mit vorgegebenen Werten zu vergleichen und man hat eine einfache Möglichkeit, Längenbegrenzungen von Eingaben zu machen.
Bspw 5-Stellige Postleitzahl:
....
$t = ($var =~ tr/[0-9]//); # Anzahl Zahlzeichen in Var $t speichern
$bt =($var =~ tr/[a-zA-Z\W\s\w ]//); # Anzahl Nichtzahlzeichen in $bt speichern
if ($t != 5 || $bt){ #wenn $t nicht gleich 5 ist oder $bt Inhalt hat
$emsg.= "Die Eingabe entspricht nicht dem üblichen PLZ-Format von 5 Zahlen, bitte wiederholen Sie die Eingabe<br>";
}
....
ohne Zwischenspeichern in Vars komplett in der bedingungszeile würde das so aussehen:
if ( ($t = ($_ =~ tr/[0-9]//))!= 5 || ($bt =( $_ =~ tr/[a-zA-Z\W\s ]//) ) ) {
$emsg.="Die Eingabe entspricht nicht dem üblichen PLZ-Format von 5 Zahlen";
}
URL zum Anschaun (beide Varianten): http://baseportal.de/cgi-bin/baseportal.pl?htx=/hempelr/temp/plz_test
(Gleich noch mit die Laufzeitanzeige beider Varianten in ner for-Schleife, damit es zu auswertbaren Zeiten kommt, man sieht deutlich den Vorteil der zweiten Variante mit der Transliteration und Wertvergleich in der Bedingungszeile)
Hoffe, nun ist es das, was du brauchst
Ruben
Antworten