Vor- und Zuname Userdaten per regex prüfen.

Sandra Haupt

Grünschnabel
Hallo,

folgendes Problem kann ich auch trotz konzentrierten Durchlesens der php.net Pattern Syntax Informationen und des php/QuakeNet Tutorials nicht zufriedenstellend lösen:

Ich möchte die Daten überprüfen, die ich von meinen Usern per Formular übermittelt bekomme. Dabei sollen nur reguläre Vor- und Zunamen, bzw. ein einzelnes Wort als Namen akzeptiert werden. Dafür habe ich diese Richtlinien aufgestellt:
  • Der erste Buchstabe des ersten Wortes muss groß geschrieben sein.
  • Danach müsen mindestens zwei kleine Buchstaben folgen.
  • Jetzt darf ein Leerzeichen erscheinen, worauf aber wieder ein Großbuchstabe folgen muss.
  • Nach einem zweiten Großbuchstaben müssen wieder mindestens zwei Kleinbuchstaben folgen.
  • Es darf nur maximal ein Leerzeichen enthalten sein.
  • Der letzte Buchstabe muss klein sein.
  • Die Minimallänge bei einem Wort beträgt drei und die maximale Länge 40 Buchstaben. Bei zwei Wörtern beträgt die minimale Länge sieben (zweimal drei plus Leerzeichen) und die maximale Länge 40 Zeichen.

Das Ganze soll per preg_match überprüft werden.

PHP:
if (!preg_match("/^[A-Z]{1}[a-z]{2,39}[ ]{0,1}/", $_POST['username'])) {

Diese Befehlszeile stellt zumindest sicher, dass der erste Buchstabe groß geschrieben wurde. Sie läßt aber leider beliebig viele Leerzeichen zu und nach einem Leerzeichen darf auch klein weiter geschrieben werden. Die Maximallänge von 40 Buchstaben kann auch überschritten werden.

Ich hoffe unter Euch befindet sich ein Experte, der mir weiterhelfen kann. Nach acht Stunden Grübeln über eine einzige Befehlszeile verzweifel ich langsam.

Liebe Grüße, Sandra
 
Versuchs mal so:
Code:
if(!preg_match("/^[A-Z][a-z]{2,}(|\s[A-Z][a-z]{2,})$/",preg_replace("/^.{41,}$/",':o(',trim($_POST['username']))))
....das eigentliche Problem ist dabei die Gesamtlänge...da man im zweiten Wort(falls vorhanden)...nicht ermitteln kann, wie lang das erste Wort ist.
Deshalb wird vor der Überprüfung, falls der gesamte username länger als 40 Zeichen ist, selbiger durch :o(ersetzt:-)...was ihn dann von vornherein ungültig macht.(das könnte man natürlich auch vorher per strlen() prüfen....und in dem entsprechenden Eingabefeld per maxlength sicherstellen)

Du solltest allerdings in Betracht ziehen, dass es auch Namen mit Umlauten und Bindestrichen gibt....welche momentan nicht möglich sind.
 
So in der Art...

Code:
$username = $_POST["username"];

$username = preg_replace("#\040{2,}#", " ", $username); // Mehrfache Leerzeichen ersetzen.
if (strlen($username) > 40) {
    $error[] = "Der Username ist zu lang.";
}
$words = explode(" ", $username);
if (count($words) > 2) {
    $error[] = "Der Username enthält zu viele Wörter.";
}
for($i = 0; $i < count($words); $i++) {
    if (!preg_match("#[A-Z][a-z]{2, 40}#", $username)) {
        $error[] = "Der Username ist ung&uuml;ltig aufgebaut.";
    }
}

if (count($error) > 0) {
    die(implode("<br />\n", $error));
}
 
Danke fatalus und Johannes,

ich habe meinen Code jetzt nach Euren Tips verbessert:

PHP:
 trim($_POST['username']);
if (strlen($_POST['username'] > 40)) {
    die ('Ihr User-Name darf nicht mehr als 40 Zeichen lang sein.');
}
if (!preg_match("/^[A-Z][a-z]{2,}(|\s[A-Z][a-z]{2,})$/", $_POST['username'])) {
    die ('Bitte benutzen Sie nur User-Namen gemäß unseren Richtlinien');
}

(edit Sandra: es steht noch ein \ vor dem s im regex, das wird aber nicht angezeigt)
Das funktioniert jetzt fehlerfrei. Jedes Wort muss groß geschrieben sein. Nur ein Space usw. :)

Ich stimme Dir mit dem Bindestrich zu, fatalus. Wenn dann sollte der aber nur in der Mitte von Wörtern zu finden sein. Bekomme ich das noch in mein regex integriert oder müßte ich es wieder vorab prüfen mit Hilfe eines weiteren preg_match Befehls? Der Code sollte nicht zu rechenintensiv werden, dann würde ich lieber auf den Bindestrich verzichten.

Liebe Grüße, Sandra.
 
Zuletzt bearbeitet:
Über die Belastung würd ich mir keine Sorgen machen...das sollte der Rechner schon schaffen :)

Das könnte so aussehen:
Code:
<?php
if(isset($_POST['username']))
    {
    if (strlen(trim($_POST['username'] ))> 40)
        {
        die ('Ihr User-Name darf nicht mehr als 40 Zeichen lang sein.');
        }

    if (!preg_match("/^[A-ZÄÖÜ][a-zäöüß]{2,}(|-[A-ZÄÖÜ][a-zäöüß]{2,})(|\s[A-ZÄÖÜ][a-zäöüß]{2,}(|-[A-ZÄÖÜ][a-zäöüß]{2,}))$/",trim($_POST['username'])))
        {
        die ('Bitte benutzen Sie nur User-Namen gemäß unseren Richtlinien');
        }
    }
?>

...das würde in Vor-und Zuname jeweils einen Bindestrich erlauben(Umlaute nunmehr auch....und das ß...vielleicht will sich ja mal der Kanzler anmelden:-))
Nach dem Bindestrich muss wiederum ein Grossbuchstabe und mindestens 2 Kleinbuchstaben kommen.....a'la Hans-Hubert Müller-Wohlfahrt

P.S.:wenn du reguläre Ausdrücke postest, dann benutze statt den PHP-Tags lieber die Code-Tags, dann verschwinden die Backslashes nachher nicht;)
 
Zurück