2011-09-26 20 views
18

Bien Tengo lo que yo llamaría una enorme lista de coordenadas de longitud y latitud. Dicho esto, también tengo un puñado de fuentes de las que extraigo estas coordenadas. Algunos de ellos provienen de métodos get/post que pueden causar posibles agujeros de seguridad en mi sitio/servicio. Así que estoy tratando de averiguar cómo validar la longitud y la latitud a través de PHP. Estaba pensando algo regex a través de preg_match. Pero podría estar equivocado, tal vez hay una manera más fácil que alguien quisiera sugerir. He intentado con mis propios conceptos, y he intentado varios conceptos de brew de Internet para tratar de encontrar un patrón de expresión regular que valide estos para mí a través de preg_match (o similar de nuevo si tienes una mejor sugerencia, soy todo oídos).php Validar cadenas de latitud/longitud en formato decimal

Mi último intento fallido antes de finalmente ceder y venir aquí fue ..

preg_match('^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$', $geoResults['latitude'])) 

que produce "preg_match() [function.preg-match]: No se delimitador final '^' encontrado" como mi error. Los últimos intentos intentaron arrojar ese error, así que no tengo ni idea de qué es ni qué significa.

+0

Esta sería también coincidir 400,00, -700 como siendo un válido lat/lng. – Layke

Respuesta

21

Añadir barras diagonales al principio y al final de la secuencia de su equipo por la sintaxis de expresiones regulares válida:

preg_match('/^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$/', $geoResults['latitude']); 

Por su pregunta sobre si se debe utilizar expresiones regulares (regex) o no, en este caso el uso de expresiones regulares (PCRE preg_match()) es la mejor manera de proteger su sitio. Cuando se combinan arreglos de cuerda complejos y variables, la expresión regular es el camino a seguir. Es común que los desarrolladores recurran a regex para hacer coincidir una cadena estática como 'abc'. Esto es cuando strpos() o str_replace() son mejores opciones.

+0

esto me pone en el camino correcto, sin embargo, lo estoy usando en una declaración if ... si esta coincidencia es inválida, ¿debería usar! Preg_match o simplemente preg_match? – chris

+0

@chris preg_match devuelve 1 (verdadero) si se encuentra una coincidencia, de lo contrario 0. Si desea comprobar si no ha encontrado una coincidencia, use '! Preg_match()' –

+0

@ChrisBornhoft no funciona con -74.052638804 = 3612 –

18

Es una vieja pregunta poco, pero de todos modos puedo enviar mi solución aquí:

preg_match('/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?);[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/', $geoResults['latlng']); 

que supone aquí que u dividir lat. de lng. por punto y coma Si quieres comprobar solo lat. o solo lng. aquí hay expresiones regulares;

RGX para lat .:

/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/ 

rgx de GNL .:

/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/ 

Aquí está una mejor demostración en línea: https://regex101.com/r/bV5fA1/1

+0

¿Por qué el límite en '80' y' 179'? – Toto

+0

He editado mi publicación y he cambiado los límites a 89. (9) y 179. (9). ¿Por qué? Debido al punto 179. (9) y -179. (9) son bastante iguales y permite hacer rgx más fácil. – Doro

+1

Mejor pero no suficient, lat 90 y long 180 son perfectamente válidos. – Toto

0

Quiero validar latitud y longitud, también , y tiene este resultado:

-90.0000 - 90,0000

^-?([0-9]|[1-8][0-9]|90)\.{1}\d{4}$ 

-180,0000 - 180,0000

^-?([0-9]|[1-9][0-9]|1[0-7][0-9]|180)\.{1}\d{4}$ 

He probado here con pcre.

+1

Deberías publicar esto como 1 expresión regular para buscar latitud y longitud desde la misma línea. Además, '[0-9] | [1-9] [0-9]' se puede simplificar como '[1-9]? [0-9]'. – Mariano

0

Es solución unicum verdadero trabajo en red " -90.0000 - 90,0000

^-?([0-9]|[1-8][0-9]|90)\.{1}\d{4}$ 

-180.0000 - 180.0000 

^-?([0-9]|[1-9][0-9]|1[0-7][0-9]|180)\.{1}\d{4}$ 
" 

Para & lat = 90,000000 & lon = 180.000000:

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

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

Por qué no hacer uso del moderno y la unidad de prueba Assertion biblioteca para que?

Ejemplo Value Object clase:

<?php 
namespace MyApp\ValueObject; 

use Assert\Assertion; 

class Location 
{ 
    private $lat; 
    private $lon; 

    public function __construct($lat, $lon) 
    { 
     Assertion::greaterOrEqualThan($lat, -90.0); 
     Assertion::lessOrEqualThan($lat, 90.0); 
     Assertion::greaterOrEqualThan($lon, -180.0); 
     Assertion::lessOrEqualThan($lon, 180.0); 

     $this->lat = $lat; 
     $this->lon = $lon; 
    } 

    public function latitude() 
    { 
     return $this->lat; 
    } 

    public function longitude() 
    { 
     return $this->lon; 
    } 

    public function __toString() 
    { 
     return $this->lat . ' ' . $this->lon; 
    } 

Uso:

$location = new \MyApp\ValueObject\Location(24.7, -20.4059); 

echo $location->latitude() , ' ' , $location->longitude(); 

// or simply 

echo $location;