Convalida nome utente come alfanumerica con caratteri di sottolineatura
-
19-09-2019 - |
Domanda
Sulla mia pagina di registrazione ho bisogno di validare i nomi utente come alfanumerico solo, ma anche di sottolineatura opzionali. Mi è venuta in mente questo:
function validate_alphanumeric_underscore($str)
{
return preg_match('/^\w+$/',$str);
}
che sembra funzionare bene, ma io non sono un esperto di regex! Qualcuno individuare alcun problema?
Soluzione
L'attuale abbinato caratteri di \w
dipendono dalla localizzazione che viene utilizzato:
"parola" Un personaggio è alcuna lettera o cifra o il carattere di sottolineatura, cioè, qualsiasi carattere che può essere parte di un Perl " parola ". La definizione di lettere e numeri è controllata da tabelle dei caratteri PCRE, e può variare in base a specifiche delle impostazioni avviene. Ad esempio, nel locale "fr" (francese), alcuni codici di carattere maggiore di 128 sono utilizzati per le lettere accentate, e questi sono accompagnati da \ w.
Così si dovrebbe meglio specificare esplicitamente quali caratteri si desidera consentire:
/^[A-Za-z0-9_]+$/
In questo modo i caratteri alfanumerici e solo il carattere di sottolineatura.
E se si desidera consentire sottolineatura solo come carattere di concatenazione e vuole forzare che il nome utente deve iniziare con un carattere alfabeto:
/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
Altri suggerimenti
Ecco una funzione personalizzata per convalidare la stringa utilizzando il PHP ctype_alnum in combinazione con una serie di caratteri consentiti:
<?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;
}
}
?>
try
function validate_alphanumeric_underscore($str)
{
return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
guarda bene a me. Si noti che si fanno alcun obbligo per il posizionamento della sottolineatura, in modo da "username_" e "___username" sarebbero entrambi passaggio.
Vorrei prendere regex secondaria di gumbo, per consentire solo sottolineatura come concatenazione, ma aggiungere un + dopo la _ in modo che un utente può essere come "special__username", solo un tweak minore.
/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/
La tua soluzione è perfettamente bene.
preg_match
utilizza espressioni regolari Perl-like, in cui il \w
classe di caratteri definito in modo da corrispondere esattamente quello che vi serve:
\w
- Partita un carattere "parola" (alfanumerico più "_")
( fonte )