2012-03-11 4 views
5

Sto cercando di imparare come utilizzare preg_match. Voglio che gli utenti possano solo registrarsi con nome utente tra 2-20 caratteri che possono contenere a-zA-Z0-9.Regex per corrispondere a 2-20 caratteri alfanumerici, consentendo un trattino singolo in qualsiasi punto della stringa

Ora la parte difficile in cui Im perdersi, io voglio che siano in grado di includere un trattino in qualsiasi parte del nome utente così,

 
-Brad = TRUE 

--Brad = FALSE 

B-Rad = TRUE 

risposta

5

È possibile costruire questo in su step-by-step. Volete un nome utente che consistono di 2-20 caratteri specifici:

^[a-zA-Z0-9]{2,20}$ 

Ora si desidera consentire a un singolo personaggio - da qualche parte in là (la parte trick):

Il carattere - è consentito solo se non è seguita da un'altra - alla fine della stringa:

[-](?=[^-]*$) 

Questo è un cosiddetto Lookahead asserzione. In combinazione con un'alternanza, la regex completa di:

^(?:[a-zA-Z0-9]|[-](?=[^-]*$)){2,20}$ 

Rispetto alle altre risposte, questo rispetta la vostra specifica lunghezza.

+0

WOW! - Grazie per questa risposta. L'hai anche spiegato bene, stavo proprio per rinunciare a provare e accontentarmi di usare due stature preg_match. –

+0

@BradleyRoberts: prego. Hai scritto che vuoi imparare * e * il modello nella tua domanda non era così ovvio, quindi c'era qualcosa con cui armeggiare;) Buona fortuna con i tuoi progressi regex, ci vuole del tempo per pensare in quel linguaggio ma è davvero potente. Puoi anche provare a migliorare provando a rispondere alle domande regex che appaiono qui, a causa delle altre risposte c'è spesso qualcosa da imparare. – hakre

3

Si potrebbe usare preg_match con:

\w*-?\w* 

E ' assicurerà che esista un trattino, ma corrisponderà anche a un trattino. È inoltre possibile utilizzare:

(\w*-?\w+)|(\w+-?\w*) 

Per evitare la corrispondenza solo con un trattino. Oppure puoi verificare se la corrispondenza ha lunghezza> 1.

Hai detto di essere in grado di, quindi ho pensato che il trattino non fosse un requisito. Se lo è, rimuovere il? nella regex.

Se si pianifica la corrispondenza in una frase, è possibile utilizzare un'interruzione di parola (\ b) con la parte \ w +. Se lo stai usando su una stringa ritagliata, aggiungi^e $ all'inizio e alla fine rispettivamente per evitare che corrisponda a --Bra-d come true.

+0

voglio gli utenti è consentito soltanto un trattino. Non devono avere un trattino. Voglio limitarli a 2-20 lunghezza del nome utente solo gli altri caratteri che saranno inclusi possono essere a-zA-Z0-9. –

+0

Ok, quindi mettendo? è meglio –

+0

questi schemi rifiutano più trattini? – dldnh

2
^[a-zA-Z0-9]*\-?[a-zA-Z0-9]*$ 

è l'espressione regolare

Modificato: Soluzione rapida per la lunghezza: utilizzare un secondo preg_match con ^.{2,20}$

+0

Sì, questo funziona, ma come posso limitare a 2-20 caratteri tutti insieme? –

+0

Grazie per la tua modifica, avrò un gioco e farò una funzione php salvami continuando a digitare in posti :) –

+2

@Bradley Roberts Anytime. Penso che sarebbe meglio usare 'strlen' per la convalida della lunghezza – dotoree

2

Ecco come lo farei:

if (preg_match(
    '/# Match pwd of alpha-numbers allowing one optional dash. 
    ^    # Anchor to start of string. 
    (?=.{2,20}\z)  # Assert length is from 2 to 20 chars. 
    [a-zA-Z0-9]*  # Zero or more alpha-num before dash. 
    (-[a-zA-Z0-9]*)? # Optional dash and more alpha-num. 
    \z    # Anchor to end of string. 
    /x', $text)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 
Problemi correlati