2010-06-08 18 views
5

Quiero una expresión regular que permite sólo esto:Una expresión regular rápida necesaria

letter a-z 
case insensitive 
allows underscores 
allows any nrs 

¿Cómo debe ser escrito?

Gracias

+0

Nada ... No sé mucho sobre regexp –

+0

¿Qué idioma? ¿Todos los que están en tus etiquetas? –

+0

php, lo siento chicos ... –

Respuesta

7

que sería

 
\w 

si no me equivoco (Como resultado, depende: En PHP las meaning of \w cambios con el locale que está vigente en la actualidad). Puede utilizar a more explicit form para clavar abajo:

 
[A-Za-z0-9_] 

lo uso en contexto, agrega de inicio de la cadena y al final de la cadena anchors y una quantifier que define el número de caracteres que va a permitir:

 
^[A-Za-z0-9_]+$ 
0
if(preg_match('/^[0-9a-z_]+$/i', $string)) { 
    //if it matches 
} 

else { 
    //if it doesn't match 
} 

[0-9a-z_] es una clase de caracteres que define los dígitos del 0 al 9, las letras a a la Z y el subrayado. El i al final hace que el partido no distinga entre mayúsculas y minúsculas. ^ y $ son anclajes que coinciden con el principio y el final de la cadena, respectivamente. El + significa 1 o más caracteres.

+2

incorrecto Esto arrojará un falso positivo si la entrada contiene un carácter válido, incluso si también contiene caracteres no válidos. – Matt

+0

Buen punto: estoy editando mi respuesta. –

+0

Esto no funcionaría. "a b c d" pasaría, ya que solo estás buscando a uno de los personajes de la cadena para que coincida. Modifique el patrón a '/^[0-9a-z _] $/i' y funcionará. – ceejayoz

5

PHP:

if (preg_match('/[^a-z0-9_]/i', $input)) { 
    // invalid input 
} else { 
    // valid input 
} 

Así [a-z0-9_] es un conjunto de caracteres para los caracteres válidos. Agregar un ^ al frente ([^a-z0-9_]) lo niega. La lógica es que si un carácter coincide con algo que NO está en el juego de caracteres válido, la entrada se considera inválida.

El /i en el extremo hace que el casamiento sea insensible.

+0

+1 - Algunas veces, la expresión regular más fácil de probar/leer es la negación. En lugar de permitir solo ciertos caracteres, solo prueba la existencia de un personaje inválido. – gnarf

+0

Pero cuando el patrón es el mismo (negación de barras), solo es cuestión de invertir los bloques if/else, o poner un '!' Antes de 'preg_match'. Negar hace que sea más fácil cuando cambias el problema, no cuando escribes el mismo patrón exacto de una manera ligeramente diferente. –

1

¿Cómo debería escribirse? (Dividirla en varias líneas)

/   # Start RegExp Pattern 
^   # Match beginning of string only 
[a-z0-9_]* # Match characters in the set [ a-z, 0-9 and _ ] * = Zero or more times 
$   # Match end of string 
/i   # End Pattern - Case Insensitive Matching 

Dándole

if (preg_match('/^[a-z0-9_]*$/i', $input)) { 
    // input is valid 
} 

También es posible usar un + en lugar de * si desea forzar al menos un carácter también.

+1

¿No es sensible a las mayúsculas y minúsculas? Su código que es (¡no es la explicación!) –

+0

@Vivin Paliath - ¡Sí! Gracias por el suave empujoncito. – gnarf

+0

¡Está bien, no hay problema! :) –

Cuestiones relacionadas