2009-08-25 14 views
33

Nella pagina di registrazione devo convalidare i nomi utente solo come alfanumerici, ma anche con caratteri di sottolineatura opzionali. Ho inventato questo:Convalidare il nome utente come alfanumerico con caratteri di sottolineatura

function validate_alphanumeric_underscore($str) 
{ 
    return preg_match('/^\w+$/',$str); 
} 

Che sembra funzionare bene, ma io non sono un esperto di regex! Qualcuno ha qualche problema?

+0

questo permetterà trattini e penso periodi così –

+0

Credo che gli spazi così potrebbe essere valido \ w –

+0

Per PRE, \ w corrisponde un carattere "parola" (alfanumerico più "_"), secondo la documentazione ufficiale di Perl: http://www.perl.com/doc/manual/html/pod/perlre.html –

risposta

65

L'attuale matched characters of \w depend on the locale che si utilizza:

"parola" Un carattere è qualsiasi lettera o cifra o il carattere di sottolineatura, cioè, qualsiasi carattere che può essere parte di un Perl "parola ". La definizione di lettere e cifre è controllata dalle tabelle dei caratteri di PCRE e può variare in caso di corrispondenza specifica per locale. Ad esempio, nella locale "fr" (francese), alcuni codici di caratteri maggiori di 128 sono usati per lettere accentate, e questi sono abbinati a \ w.

così si dovrebbe meglio specificare in modo esplicito quali caratteri si desidera consentire:

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

Questo consente solo caratteri alfanumerici e 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 una lettera dell'alfabeto:

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

Perché?\ w è esattamente caratteri alfanumerici e sottolineatura. –

+11

In realtà, \ w è composto da caratteri alfanumerici e caratteri di sottolineatura in base alle impostazioni internazionali attive, pertanto, a seconda delle circostanze, potrebbe corrispondere a caratteri come "ü" o "ö". –

+1

@af, ah, hai ragione. Grazie per la correzione! –

10

provare

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

guarda bene a me. Si noti che non è necessario il posizionamento del carattere di sottolineatura, quindi "username_" e "___username" passerebbero entrambi.

+0

Potresti dirmi come impostare il limite su un carattere di sottolineatura tra le lettere? – AlexioVay

0

La tua soluzione è perfettamente a posto.

preg_match utilizza espressioni regolari Perl-like, in cui la classe del personaggio \w definito in modo da corrispondere esattamente quello che vi serve:

\w - Partita un carattere "parola" (alfanumerico più "_")

(source)

16

Ecco una funzione personalizzata per convalidare la stringa utilizzando il PHP ctype_alnum in combinazione con una matrice o f permesso caratteri:

<?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

In generale, mi piace evitare le espressioni regolari dove posso. Per questo tipo di convalida questo sembra meno incline agli errori ed è più facile da capire (lo sviluppatore deve solo conoscere php, non ha bisogno di conoscere la sintassi regex). La soluzione è unica per php ma è quello che sto cercando. Grazie. –

1

avrei preso 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]+)*$/

Problemi correlati