Was macht man, wenn ein User aus welchen Gründen auch immer ein oder mehrere Leerzeichen um seinen User-Namen hat?
Nö. Man stellt von Anfang an sinnvolle Regeln auf, was in einem Username erlaubt ist.
Generell (a.k.a: „oft“, „im Hinblick auf Interoperabilität“) ist es eine gute Idee, folgendes vorzuschreiben:
- Mindestlänge: 3 Zeichen
- Erlaubte Zeichen: ASCII-Buchstaben, Ziffern, "_"
- Beginnt mit: Buchstabe
- nur kleine Buchstaben (oft werden große und kleine nicht unterschieden - manchmal können das z.B. Datenbanken nicht)
Zudem würde ich diese Eingabe stets trimmen (Copy & Paste-Fehler), Groß/Klein-Schreibung stillschweigend durch Umwandlung sanieren, eventuell nicht erlaubte Zeichen durch Löschen „sanieren“ - macht man die beiden letzteren, dann muss man das aber künftig stets tun!
In PHP kann das so oder so ähnlich aussehen:
<?php
function saniticeUsername(
$s,
$returnSanitized = false,
$minLength = 3,
$toLower = true,
$RegexAllowedChars = 'A-Za-z0-9_',
$RegexAllowedFirstchar = 'A-Za-z'
) {
#first: trim the input (blanks @start or end of a name are in most cases copy & paste-errors - or typos
$s = trim( $s );
# check the minlenght:
if ( $minLength > strlen( $s ) ) {
$out['err'] ='to short';
$out['Username'] = false;
$out['is_sanitized'] = false;
return $out;
}
#sanitice to lower:
if ( $toLower ) {
$s = strtolower( $s );
}
# mask meta chars in regex:
$SpecialChars = explode( ' ', '/ \ [ ^ ]' );
foreach ( $SpecialChars as $char ) {
$SpecialCharsReplacements[] = '\\' . $char;
}
$pattern = '/[^' . str_replace( $SpecialChars, $SpecialCharsReplacements, $RegexAllowedChars ) . ']/';
# remove all not allowed chars
$sanitized = preg_replace( $pattern, '', $s );
if ( $minLength > strlen( $sanitized ) ) {
$out['err'] = 'to short';
$out['Username'] = false;
$out['is_sanitized'] = false;
return $out;
}
# check the first char and make returns:
$firstChar = $s[0];
$pattern = '/[' . str_replace( $SpecialChars, $SpecialCharsReplacements, $RegexAllowedFirstchar ) . ']/';
if ( 1 !== preg_match( $pattern, $firstChar ) ) {
$out['err'] ='first char not allowed';
$out['Username'] = false;
$out['is_sanitized'] = false;
return $out;
}
if ( $returnSanitized ) {
if ( $s != $sanitized ) {
$out['is_sanitized'] = true;
} else {
$out['is_sanitized'] = false;
}
$out['err'] = false;
$out['Username'] = $sanitized;
return $out;
} else {
if( $s !== $sanitized) {
$out['err'] = 'not allowed chars in username';
$out['Username'] = false;
$out['is_sanitized'] = false;
return $out;
} else {
$out['err'] = false;
$out['Username'] = $sanitized;
$out['is_sanitized'] = false;
return $out;
}
}
}
################################## Tests: #############################
header('Content-Type: text/plain; charset=utf-8');
$userNames=[
'0joerg',
'Jörg',
'Joerg',
'<Joerg>',
' Jo',
' Jörg',
' Joerg',
' <Joerg>',
' Jo',
'Jörg ',
'Joerg ',
'<Joerg> ',
'Jo ',
' Jörg ',
' Joerg ',
' <Joerg> ',
' Jo ',
'0joerg',
' 0joerg',
'joerg$',
'joe@rg'
];
echo "Test: sanitized names allowed =============================\n";
foreach ( $userNames as $username ) {
echo $username . ':'. PHP_EOL;
var_dump( saniticeUsername( $username, true ) );
echo PHP_EOL;
}
echo "Test: sanitized names forbidden =============================\n";
foreach ( $userNames as $username ) {
echo $username . ':'. PHP_EOL;
var_dump( saniticeUsername( $username ) );
echo PHP_EOL;
}
echo "Test: $ + @ allowed =============================\n";
foreach ( $userNames as $username ) {
echo $username . ':'. PHP_EOL;
var_dump( saniticeUsername( $username, false, 3, true, 'A-Za-z0-9@$_' ) );
echo PHP_EOL;
}