2010-07-11 14 views
8

estoy usando esto: if(!preg_match('/^+[0-9]$/', '+1234567'))preg_match: nada que repetir/no puede competir

y estoy recibiendo:

Advertencia: preg_match() [function.preg-match]: Compilación falló: nada para repetir en el desplazamiento 1

¿Alguna idea de por qué?


actualización: Ahora, utilizando la siguiente: if(!preg_match('/^\+[0-9]$/', '+1234567'))

y estoy recibiendo ninguna coincidencia.

¿Alguna idea de por qué?

Respuesta

20

+ es un carácter especial que indica 1 o más del carácter anterior, y al no escaparse lo está aplicando al cursor. escape con \ y coincidirá con un signo más literal.

if(!preg_match('/^\+[0-9]$/', '+1234567')) 

EDIT:

La razón por la que no coincide es porque ha especificado 1 dígitos 0-9 y el final de la cadena con $. Necesita convertirlo en una cantidad variable de dígitos.

if(!preg_match('/^\+[0-9]+$/', '+1234567')) { 

versión más corta:

if(!preg_match('/^\+\d+$/', '+1234567')) { 
+0

Cheers, Hemos editado la pregunta ahora para reflejar el problema actual. – Hailwood

+0

Hailwood, no debería eliminar el viejo problema, pero debería mostrar ambos juntos. (solo editado para hacer eso). –

+0

Además, el problema actual es el comportamiento correcto: le está pidiendo a Regex que coincida con un solo más, un único 0..9, luego encuentre la posición de final de línea, que su entrada no hace. Para que coincida con la entrada suministrada, desea '^ \ + [0-9] + $' o '^ \ + [0-9] {7} $' o similar. –

3

'/^\+[0-9]$/' significa que inicio de la línea tiene que ser signo más folowed por un número a continuación, final de la línea.

'/^\+[0-9]+$/' significa que el comienzo de la línea tiene que ser un signo más seguido de un uno o más números y al final de la línea.

Cuestiones relacionadas