tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
837
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Sandra Haupt Sandra Haupt ist offline Mitglied
    Registriert seit
    May 2004
    Ort
    Berlin
    Beiträge
    14
    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-Code:
    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
     

  2. #2
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Versuchs mal so:
    Code :
    1
    
    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.
     

  3. #3
    Registriert seit
    Nov 2002
    Beiträge
    2.709
    So in der Art...

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    $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));
    }
     
    Im Ruhestand.

  4. #4
    Sandra Haupt Sandra Haupt ist offline Mitglied
    Registriert seit
    May 2004
    Ort
    Berlin
    Beiträge
    14
    Danke fatalus und Johannes,

    ich habe meinen Code jetzt nach Euren Tips verbessert:

    PHP-Code:
     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.
    Geändert von Sandra Haupt (20.07.04 um 16:50 Uhr)
     

  5. #5
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Über die Belastung würd ich mir keine Sorgen machen...das sollte der Rechner schon schaffen

    Das könnte so aussehen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    <?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
     

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 25.06.10, 12:07
  2. URL prüfen mit Regex
    Von HerbertJ im Forum PHP
    Antworten: 3
    Letzter Beitrag: 22.12.09, 11:42
  3. Tokens auf regex prüfen
    Von hispeedsurfer im Forum Java
    Antworten: 10
    Letzter Beitrag: 29.11.06, 09:01
  4. Antworten: 0
    Letzter Beitrag: 01.08.06, 02:22
  5. Antworten: 1
    Letzter Beitrag: 22.08.05, 13:18