2009-08-25 7 views
33

Auf meiner Registrierungsseite muss ich die Benutzernamen nur als alphanumerisch, aber auch mit optionalen Unterstrichen validieren. Ich habe mir folgendes einfallen lassen:Benutzernamen als alphanumerisch mit Unterstrichen validieren

Das scheint in Ordnung zu arbeiten, aber ich bin kein Regex-Experte! Erkennt jemand irgendein Problem?

+0

diese Bindestriche erlaubt und ich denke Perioden als auch –

+0

ich Leerzeichen denken könnte auch gültig sein, mit \ w –

+0

Für PRE, \ w entspricht ein „Wort“ Zeichen (alphanumerische plus „_“), laut der offiziellen Perl-Dokumentation: http://www.perl.com/doc/manual/html/pod/perlre.html –

Antwort

65

Die tatsächliche matched characters of \w depend on the locale, die verwendet wird:

ein „Wort“ -Zeichen ein beliebiger Buchstabe oder eine Ziffer oder das Unterstreichungszeichen ist, das heißt, jedes Zeichen, das Teil eines Perl "Wort sein kann ". Die Definition von Buchstaben und Ziffern wird von den Zeichentabellen von PCRE gesteuert und kann variieren, wenn ein lokalisierungsspezifischer Abgleich stattfindet. Im Gebietsschema "fr" (Französisch) werden beispielsweise für Buchstaben mit Akzenten einige Zeichencodes größer als 128 verwendet, die mit \ w übereinstimmen.

So sollten Sie besser explizit angeben, welche Zeichen Sie zulassen möchten:

/^[A-Za-z0-9_]+$/ 

Dieses nur alphanumerische Zeichen erlaubt und den Unterstrich.

Und wenn Sie Strich nur als Verknüpfungszeichen zulassen wollen und wollen erzwingen, dass der Benutzername mit einem Zeichen aus dem Alphabet beginnen muss:

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/ 
+1

Warum?\ w ist genau alphanumerische Zeichen und Unterstriche. –

+11

Tatsächlich sind \ w alphanumerische Zeichen und Unterstriche entsprechend dem aktiven Gebietsschema, daher können abhängig von den Umständen Zeichen wie 'ü' oder 'ö' übereinstimmen. –

+1

@af, ah, du hast Recht. Danke für die Korrektur! –

10

versuchen

function validate_alphanumeric_underscore($str) 
{ 
    return preg_match('/^[a-zA-Z0-9_]+$/',$str); 
} 
3

Sieht für mich in Ordnung. Beachten Sie, dass Sie für die Platzierung des Unterstrichs keine Anforderungen stellen müssen, sodass "username_" und "___username" beide übergeben werden.

+0

Können Sie mir sagen, wie Sie das Limit auf einen Unterstrich zwischen Buchstaben setzen können? – AlexioVay

0

Ihre eigene Lösung ist völlig in Ordnung.

preg_match verwendet Perl-wie reguläre Ausdrücke, in denen die Zeichenklasse \w definiert genau entsprechen, was Sie brauchen:

\w - passt ein "Wort" Zeichen (alphanumerische plus "_")

(source)

16

Hier ist eine benutzerdefinierte Funktion, die Zeichenfolge mit Hilfe der PHP ctype_alnum in Verbindung mit einer Anordnung zur Validierung o f erlaubte Zeichen:

<?php 

$str = ""; 
function validate_username($str) { 

    // each array entry is an special char allowed 
    // besides the ones from ctype_alnum 
    $allowed = array(".", "-", "_"); 

    if (ctype_alnum(str_replace($allowed, '', $str))) { 
    return $str; 
    } else { 
    $str = "Invalid Username"; 
    return $str; 
    } 
} 

?> 
+4

Im Allgemeinen mag ich es, reguläre Ausdrücke zu vermeiden, wo ich kann. Für diese Art von Validierung scheint dies weniger fehleranfällig zu sein und einfacher zu verstehen (Entwickler braucht nur PHP zu kennen, muss die Regex-Syntax nicht kennen). Die Lösung ist einzigartig für PHP, aber das ist, was ich suche. Danke. –

1

Ich würde Gumbo des sekundären regex nehmen, nur um Unterstrich als Verkettung zu erlauben, aber ein + nach dem hinzufügen _ so ein Benutzer wie „special__username“ sein kann, nur eine geringfügige zwicken.

/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/

Verwandte Themen