PHP String auf Anzahl der Zahlen und Buchstaben überprüfen

P

penquin

Gast
Hallo zusammen,

mittels URL übertrage ich einen automatisch generierten Wert, der immer aus drei Ziffern und einem Großbuchstaben besteht und so aufgebaut ist: 123A

Momentan überprüfe ich die Länge und das vorhanden sein von nur Buchstaben und Zahlen mit folgendem Code:
PHP:
$nr = $_GET['nr'];

if (strlen($nr) == 4 && ctype_alnum($nr)) {
    echo "Nummer akzeptiert";
} else {
    echo "Ungueltige Nummer";
}

Im Grunde reicht mir das auch aus, allerdings würde mich interessieren, ob man auch die Anzahl der Ziffern - müssen immer drei sein - und die Anzahl der Buchstaben - muss immer einer am Ende des Strings sein - auch noch überprüfen kann.

Zu erwähnen sei noch, dass ich was PHP angeht blutiger Anfänger bin und auch das Handbuch schon ausgiebig durchsucht habe, aber keine passende Funktion gefunden habe. Es reicht mir aus, wenn ihr mir den Namen einer passenden Funktion geben würdet, damit ich mich selbst damit auseinandersetzen kann - ein fertiges Script möchte ich nicht. :)

Vielen Dank im Voraus
penquin
 
die letzte ziffer bekommst du so:
Code:
substr($nr, -1, 1)

und die anzahl der ziffern, kannst du mit strlen() prüfen, die funktion gibt die länge des eingegebenen strings zurück.
 
Vielen Dank für die Tipps, Jungs! :daumen:

Ich habe es nun wie folgt gelöst:
PHP:
$nr = $_GET['nr'];
$nrz = substr($nr, 0, -1);
$nrb = substr($nr, -1);

if(strlen($nr) == 4 && ctype_alnum($nr) && is_numeric($nrz) && ctype_upper($nrb)) {
    echo "Nummer akzeptiert";
} else {
    echo "Ungueltige Nummer";
}

Gibt es daran etwas auszusetzen, oder ist das ok so? Es funktioniert zumindest tadellos. :p

Danke und Gruß
penquin
 
ctype_alnum könnte dir evtl in den Hintern beißen. das wird immerhin auch dann wahr, wenns ne ziffer ist (alpha-numerisch halt), nicht nur bei buchstaben.

Der richtige Weg wäre wohl wirklich oben genannter regulärer Ausdruck über preg_match.
Regexp sind rätselhafte und mächtige Instrumente, deren Rätselhaftigkeit nur von ihrer Macht übertroffen wird.
 
ctype_alnum ist ohnehin raus geflogen, da letzten beiden Funktionen den zerlegten String eh schon auf seine Richtigkeit überprüfen. Mit Regexp muss ich mich demnächst noch beschäftigen, da hab ich absolut gar keinen Durchblick bisher. :D

Update:
is_numeric habe ich jetzt noch gegen ctype_digit ausgetauscht, da ansonsten auch ein Punkt innerhalb der drei Ziffern TRUE ausgegeben hätte.

So sieht nun das vorläufige Endergebnis aus:
PHP:
$nr = $_GET['nr'];
$nrz = substr($nr, 0, -1);
$nrb = substr($nr, -1);

if(strlen($nr) == 4 && ctype_digit($nrz) && ctype_upper($nrb)) {
	echo "Nummer akzeptiert";
} else {
	echo "Ungueltige Nummer";
}
 
Zuletzt bearbeitet:
Ungetestet ginge, wenn du auf regex verzichten willst, auch sowas mit einem substring

PHP:
if(strlen($nr) == 4 && ctype_digit(substr($nr,0,2)) && ctype_alpha($nr{3})) {}

edit: dein edit ist natürlich besser wenn der Buchstabe eh gross sein muss. Für ein Zeichen brauchst du jedenfalls kein substr call
edit2: und ab PHP 6 sollte man square braces statt curly braces verwenden, geht bisher aber beides.
 
Zuletzt bearbeitet:
carom schrieb:
edit2: und ab PHP 6 sollte man square braces statt curly braces verwenden, geht bisher aber beides.

Auf welche Stelle trifft das zu? Für ctype_alpha($nr{3})?

@Daaron: Danke, werde ich mir auf jeden Fall ansehen.

Ich hab es nach dem Vorschlag von carom jetzt wie folgt umgesetzt:
PHP:
$nr = $_GET['nr'];

if(strlen($nr) == 4 && ctype_digit(substr($nr,0,-1)) && ctype_upper($nr[3])) {
	echo "Nummer akzeptiert";
} else {
	echo "Ungueltige Nummer";
}

Gibt es daran etwas auszusetzen? Funktioniert jedenfalls wie es soll.

Vielen Dank für eure Hilfe! :daumen:
 
Regex is dafür zu empfehlen : o spart Zeilen und wenn man es beherrscht, dann kann man viele schöne Dinge damit machen ;)
 
Ich hab mich dann doch mal an Regex versucht und folgendes gebastelt, was auch funktioniert:
PHP:
$nr = $_GET['nr'];

if(preg_match('/^[0-9]{3}+[A-Z]{1}$/', $nr)) {
	echo "Nummer gueltig";
} else {
	echo "Nummer ungueltig";
}

Wie immer bin ich unsicher, ob das Alles auch wirklich richtig ist. Klar, es funktioniert, aber gibt es da noch etwas zu verbessern?

Vielen Dank im Voraus
penquin
 
Das "+" sollte auf jeden Fall weg und als Abkürzung für "[0-9]" kannst du "\d" schreiben. "{1}" nicht zwingend nötig, kann aber der Übersichtlichkeit wegen auch bleiben.
Um den Benutzer nicht mit Großbuchstaben zu gängeln solltest du dies benutzen:
PHP:
$nr = strtoupper($_GET['nr']);
 
Ich gängel niemanden. :p Der Wert in $nr wird automatisch mit einem Großbuchstaben generiert, so dass der Besucher da eigentlich gar nichts dran fummeln muss/sollte.

Mit euren zahlreichen Tipps bin ich nun zu diesem Ergebnis gekommen:
PHP:
$nr = $_GET['nr'];

if(preg_match('/^\d{3}[A-Z]$/', $nr)) {
	echo "Nummer gueltig";
} else {
	echo "Nummer ungueltig";
}

Funktioniert tadellos. Gibt es noch etwas zu meckern? :D

Vielen Dank
penquin
 
Na wenn du schon so fragst...
Encoding auf UTF-8 stellen und "ü" statt "ue" schreiben.... oder halt ü, wobei UTF-8 echt die bessere Variante ist.
 
Zurück
Oben