2012-03-11 14 views
5

Estoy tratando de aprender a usar preg_match. Quiero que los usuarios solo puedan registrarse con un nombre de usuario de entre 2 y 20 caracteres que pueden contener a-zA-Z0-9.Regex para que coincida con 2-20 caracteres alfanuméricos, lo que permite un solo guión en cualquier lugar de la cadena

Ahora la parte difícil, donde Im consiguiendo perdió, quiero que sean capaces de incluir un guión en cualquier parte del nombre de usuario para,

 
-Brad = TRUE 

--Brad = FALSE 

B-Rad = TRUE 

Respuesta

5

Usted puede construir esto paso a paso. ¿Quieres un nombre de usuario que consisten en 2-20 caracteres específicos:

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

Ahora desea permitir que un solo carácter - en algún lugar de allí (la parte truco):

El carácter - sólo se permite si no es seguida por otra - al final de la cadena:

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

Este es un llamado Lookahead afirmación. En combinación con una alternancia, la expresión regular completa a:

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

En comparación con las otras respuestas dadas, éste respeta su especificación de longitud.

+0

WOW! - Gracias por esta respuesta. También lo explicaste bien, estaba a punto de dejar de intentarlo y conformarme con el uso de dos estatutos de preg_match. –

+0

@BradleyRoberts: De nada. Usted escribió que quiere aprender * y * el patrón en su pregunta no era tan obvio, así que había algo con lo que jugar;) Buena suerte con su progreso de expresiones regulares, lleva tiempo pensar en ese lenguaje, pero es realmente poderoso. También puede tratar de mejorar al tratar de responder las preguntas de expresiones regulares que aparecen aquí, debido a las otras respuestas, a menudo hay algo que aprender. – hakre

3

Usted podría utilizar preg_match con:

\w*-?\w* 

Se se asegurará de que exista un guión, pero también coincidirá solo con un guión. También puede utilizar:

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

Para evitar que coincida solo con un guión. O puede verificar si la coincidencia tiene una longitud> 1.

Usted dijo que podía, por lo que asumí que el guión no es un requisito. Si es así, elimina el? en la expresión regular

Si planeas emparejar en una oración, podrías usar un salto de palabra (\ b) con la parte \ w +. Si está utilizando esto en una cadena recortada, agregue^y $ al inicio y al final respectivamente para evitar que coincida con --Bra-d como verdadero.

+0

Quiero que los usuarios que se permita sólo un guión. No tienen que tener un guion Quiero limitarlos a 2-20 largos de nombre de usuario, solo otros caracteres que se incluirán pueden ser a-zA-Z0-9. –

+0

Ok, ¿luego poner? es lo mejor –

+0

¿estos patrones rechazan múltiples guiones? – dldnh

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

es la expresión regular

Editado: Solución rápida para la longitud: utilizar un segundo preg_match con ^.{2,20}$

+0

Sí, esto funciona, pero ¿cómo puedo limitarlo a 2-20 caracteres? –

+0

Gracias por su edición, voy a tener un juego y hacer una función de php, sálvame, sigue tipeando en lugares :) –

+2

@Bradley Roberts Anytime. Creo que sería mejor utilizar 'strlen' para la validación de longitud – dotoree

2

Así es como yo lo haría:

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 
} 
Cuestiones relacionadas