2011-01-27 21 views
5

Necesito una expresión regular para la validación de cadena. La cadena puede estar vacía, puede tener 5 dígitos y puede tener 9 dígitos. Otras situaciones no son válidas. Estoy usando la siguiente expresión regular:PHP longitud de dígito regex solo 5 o 9

/\d{5}|\d{9}/ 

Pero no funciona.

+2

'/^(\ d {5}) (\ d {4})?) $ /'? Suponiendo que los dígitos son lo único en la cadena, esto coincidiría con 5 dígitos, opcionalmente seguidos por 4 más. –

+0

@MarcB: Eso ni siquiera es sintácticamente válido. –

+0

Cuirious, ¿qué te diría la cuerda vacía? – sln

Respuesta

16

Así como Marc B said in the comments, me gustaría utilizar esta expresión regular:

/^(\d{5}(\d{4})?)?$/ 

Esto coincide con cualquiera de exactamente cinco dígitos que pueden ser seguidos por otros cuatro dígitos (por lo tanto nueve dígitos en total) o ningún carácter en todo (observe el cuantificador ? alrededor de la expresión de dígitos que hace que el grupo sea opcional).

La ventaja de este patrón en oposición a los otros patrones mencionados con alternancias es que esto no requerirá retroceder si fallan los cinco dígitos coincidentes.

1

"no funciona" no es de mucha ayuda. pero, ¿no sería algo como esto?

/^(\d{5}|\d{9}|)$/ 

(poco oxidado en la expresión regular, pero yo estoy tratando de hacer es "iniciar, a continuación, 5 o 9 dígitos o nada, y luego terminar)

3
~^(?:\d{5}|\d{9}|)$~ 

te olvidó los anclajes ^ y $ Sin ellos, la cadena coincidiría con esos dígitos en cualquier lugar de la cadena, no solo al principio o al final. Además, no cubrió la caja de la cuerda vacía.

4

use anclajes y "?" Para permitir la cadena vacía

/^(\d{5}|\d{9})?$/ 
1

La respuesta de por qué no funciona es con Perl style Las alternancias de regex se priorizan de izquierda a derecha.

Cambiar a:

/\d{9}|\d{5}/ (Sin embargo, esto no le dirá nada más acerca de 6-8 y 10-infinity a menos que su anclada con las afirmaciones o algo más.)

/^(\d{5}|\d{9}|)$/

Cuestiones relacionadas