2012-04-02 10 views
3

Ich versuche, Benutzernamen in PHP mit preg_match() zu validieren, aber ich kann nicht scheinen, es funktioniert so, wie ich es will. Ich benötige preg_match() zu:Wie `preg_match()` verwenden, um einen Benutzernamen

  1. Buchstaben und Zahlen nur am Anfang und am Ende der
  2. Zeiten akzeptieren Zeichenfolge akzeptieren, Bindestriche, unterstreicht, Buchstaben, Zahlen
  3. muss eine Länge zwischen 5-20 Zeichen

preg_match('/^[a-zA-Z0-9]+[.-_]*[a-zA-Z0-9]{5,20}$/', $username) 

Antwort

6

brechen die Anforderungen in kleinere Stücke und Sie werden sehen, dass es viel einfacher wird:

  • Das erste Zeichen muss ein Buchstabe oder Zahl
  • Die mittleren Zeichen muss ein Punkt, Strich, Unterstrich, Buchstabe oder Nummer sein
  • Das letzte Zeichen muss ein Buchstabe oder eine Nummer sein
  • Als die ersten und letzten Segmente 1 Zeichen sein muss, muss das Mittelstück 3 zu 18
~^[a-z0-9]{1}[a-z0-9._-]{3,18}[a-z0-9]{1}$~i 
+3

Sie brauchen nicht '{1}', da die Klammern darauf schließen lassen, dass ein _one_ Zeichen im Satz übereinstimmt. Außerdem müssen Sie den Punkt in der zweiten Klammer entfernen, sonst passt er offensichtlich zu jedem Zeichen. – Madbreaks

+1

@Madbreaks Eigentlich denke ich, in diesem Zusammenhang muss der Zeitraum nicht entgangen sein. Es würde aber definitiv nichts schaden. Und was die {1} betrifft, hast du recht, dass diese überflüssig sind, aber ich mag es, sie nur teilweise aus Gewohnheit zu machen, und teilweise, weil ich meine regulären Ausdrucksmöglichkeiten so gut wie möglich für das Auge mag. – Corbin

+1

Danke Corbin, du hast Recht bezüglich des Punktes - danke für den Hinweis auf MEIN Fehler! – Madbreaks

2

Wenn die Regex Sie ist verwirrend, könnte man immer Passen Sie die Zeichen mit einer Regex an und überprüfen Sie dann explizit die Länge der Zeichenfolge mit strlen().

$valid = preg_match('/^[a-zA-Z\d]+[\w.-]*[a-zA-Z\d]$/', $username) 
     AND strlen($username) >= 5 AND strlen($username) <= 20; 
2
if (preg_match('~^[0-9a-z][-_.0-9a-z]{3,18}[0-9a-z]$~i', $username) > 0) 
{ 
    // valid 
} 
+0

@ Alex sein: Sie sind falsch. =) –

+0

Sie müssen diesen Punkt in der zweiten Reihe von Klammern oder es wird natürlich jedes Zeichen übereinstimmen. – Madbreaks

+2

@Madbreaks: Nein, wird es nicht. Du liegst auch falsch. =) –

Verwandte Themen