2009-08-03 19 views
10

Estoy buscando una expresión regular que verifique si la cadena solo consta de las letras az, números, guión bajo (_) y guión (-). He intentado esto, pero no funciona:Necesito una expresión regular que compruebe si la cadena solo consta de letras az y números y guión bajo (_) y guión (-)

if (!preg_match('/^a-zA-Z0-9_-$/', $string)) { 
    $reg_Error[] = 2; 
} 

Además, ¿puedo verificar la longitud con expresiones regulares? Si no, lo haré con PHP.

+2

Verifique la longitud con strlen. Regex es una herramienta, no un martillo. :) – OIS

Respuesta

1

La expresión regular debe ser: '^ [\ w \ d -] + $'

+1

Explicar que: '-' es un caracter especial entre corchetes * a menos que * sea el primer o el último caracter entre corchetes. –

+0

'a-zA-Z_' se puede reemplazar por' \ w', '0-9' se puede reemplazar por' \ d' – RaYell

+1

'a-zA-Z0-9_' solo se puede reemplazar por' \ w'. –

3

más corta:

/^ [\ w -] + $/

+1

Aún más corto: '/^[\ w -] + $ /' – RaYell

+0

¿Y dónde está el guión bajo? – seize

+1

El guión bajo es parte de '\ w'. –

14

Tienes que poner tu expresión regular /^a-zA-Z0-9_-$/ en una clase de caracteres /[...]/.
Significa que puede hacer coincidir cualquier carácter en la clase de caracteres. También debe especificar un cuantificador, porque /^[a-zA-Z0-9_-]$/ coincidirá solo con un carácter.

Ejemplos:
/^[a-zA-Z0-9_-]+$/ con el signo + que coinciden con uno o más tiempo
/^[a-zA-Z0-9_-]{1,}$/ el mismo que el anterior
/^[a-zA-Z0-9_-]{10,20}$/ entre 10 y 20 caracteres de longitud.
/^[a-zA-Z0-9_-]{15}$/ tiene que ser exactamente 15 caracteres de largo. Puedes usarlo para verificar la longitud de la cuerda.

También puede utilizar la siguiente palabra clave para que su expresión regular fácil de leer:
/^[\w-]+$/ que coincide con un carácter de palabra (incluido el subrayado, las letras y dígitos) o un guión, una o más veces.

1

Las respuestas hasta ahora explicar correctamente la clase de caracteres/^[A-Za-z0-9_-]+$/

Puede comprobar la longitud. + significa "uno o más de los precedentes", * significa cero o más de los "y {2,4} precedentes" entre 2 y 4 del precedente ".

No se puede especificar la longitud tiene que Sin embargo, es necesario especificar que la longitud tiene que ser par, pero no es trivial:/^(xx){1,3}$/coincide con xx, xxxx o xxxxxx. El recuento aquí se refiere al número de pares, no el número de x'es

6

me gustaría utilizar esta:

/^[a-z_\-\d]+$/i 

cuanto a por qué no estoy usando \w, la siguiente qu ota, tomada de PHP PCRE Pattern Reference, debe explicar por qué no se debe utilizar en esta situación \w:

Una "palabra" carácter es cualquier letra o dígito o el carácter de subrayado, es decir, cualquier carácter que puede ser parte de una "palabra" de Perl. La definición de letras y dígitos está controlada por las tablas de caracteres de PCRE, y puede variar si se lleva a cabo una coincidencia específica de la configuración regional. Por ejemplo, en la configuración regional "fr" (francés), algunos códigos de caracteres superiores a 128 se utilizan para letras acentuadas, y éstas se corresponden con \w.

Ese comportamiento no es deseable en este caso, por lo menos que quiere es preocuparse por la configuración regional, utilizar clases de caracteres rectos en lugar de la \w taquigrafía.

Si desea especificar una longitud mínima (por ejemplo 3):

/^[a-z_\-\d]{3,}$/i 

Si desea especificar tanto una longitud mínima y máxima (por ejemplo, 2 y 5):

/^[a-z_\-\d]{2,5}$/i 
Cuestiones relacionadas