2011-08-18 21 views
6

Estoy dejando que los usuarios introducen los valores de GPS a través de un formulario, todos ellos tienen la misma forma, algunos ejemplos:¿Qué expresión de expresiones regulares verificará los valores de GPS?

49.082243,19.302628 

48.234142,19.200423 

49.002524,19.312578 

Quiero comprobar el valor introducido en PHP (usando preg_match(), supongo), pero como No soy bueno en expresiones regex (oh, tonto, finalmente debería aprenderlo, lo sé), no sé cómo escribir la expresión.

Obviamente que debe ser:
2x (números), 1x (punto), 6x (números), 1x (coma), 2x (números), 1x (DOT), 6x (números)

Cualquier sugerencias de cómo escribir esto en expresiones regulares?

Respuesta

10

Algo así como:

/^(-?\d{1,2}\.\d{6}),(-?\d{1,2}\.\d{6})$/ 
  • ^ anclas en el inicio de la entrada
  • -? permite, pero no requiere, un signo negativo
  • \d{1,2} requiere 1 o 2 dígitos decimales
  • \. requiere un punto decimal
  • \d{6} requiere exactamente 6 dígitos decimales
  • , coincide con una sola coma
  • (repetir los primeros 5 balas)
  • $ anclas en el final de la entrada

He incluido la captura de paréntesis, para que pueda extraer las coordenadas individuales. Siéntase libre de omitirlos si no los necesita.

Todo alrededor útiles referencia de expresiones regulares: http://www.regular-expressions.info/reference.html

+1

Mira que es un valor GPS esos dos valores separados por una coma. –

+0

¡Ah! Mi error, se actualizará. –

+0

+1 para explicación adicional –

1
/$-?\d{2}\.\d{6},-?\d{2}\.\d{6}^/ 
1

Ampliando la otra respuesta:

/^-?\d\d?\.\d+,-?\d\d?\.\d+$/ 
13

Las otras respuestas que veo no tiene en cuenta que la longitud va desde -180 a 180 y la latitud va de -90 a 90.

La expresión regular adecuada para esto sería (suponiendo que el orden sea "latitud, longitud"):

/^(-?[1-8]?\d(?:\.\d{1,6})?|90(?:\.0{1,6})?),(-?(?:1[0-7]|[1-9])?\d(?:\.\d{1,6})?|180(?:\.0{1,6})?)$/ 

Esta expresión regular cubre que tiene no menos de -90 y no más de 90 para la latitud, así como no menos de -180 y no más de 180 para la longitud al tiempo que permite que pongan en números enteros, así como cualquier número de decimales del 1 al 6; si desea permitir una mayor precisión simplemente cambie {1,6} a {1, x} donde x es el número de la posición decimal

Además, si captura en el grupo 1, obtener la latitud y una captura en el grupo 2 obtiene la longitud.

0

Basado en su ejemplo, esto lo hará:

if (preg_match('/(-?[\d]{2}\.[\d]{6},?){2}/', $coords)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

Explicación:

(   # Match the regular expression below and capture its match into backreference number 1 
-   # Match the character “-” literally 
?   # Between zero and one times, as many times as possible, giving back as needed (greedy) 
[\d]  # Match a single digit 0..9 
{2}  # Exactly 2 times 
\.   # Match the character “.” literally 
[\d]  # Match a single digit 0..9 
{6}  # Exactly 6 times 
,   # Match the character “,” literally 
?   # Between zero and one times, as many times as possible, giving back as needed (greedy) 
){2}  # Exactly 2 times 
Cuestiones relacionadas