2011-09-26 13 views
18

Va bene, ho una lista enorme di coordinate di longitudine e latitudine. Detto questo ho anche una manciata di fonti da cui estrarre queste coordinate. Alcuni di essi provengono da metodi di acquisizione/pubblicazione che possono causare potenziali falle di sicurezza nel mio sito/servizio. Quindi sto cercando di capire come convalidare longitudine e latitudine tramite PHP. Stavo pensando a qualcosa di regex via preg_match. Ma potrei sbagliarmi, forse c'è un modo più semplice che qualcuno vorrebbe suggerire. Ho provato i miei concetti, e ho provato vari concetti di Internet brew di cercare di trovare un modello regex che li convalida per me tramite preg_match (o simili di nuovo se hai un suggerimento migliore, sono tutto orecchie).php Validare le stringhe di latitudine/longitudine in formato decimale

mio ultimo tentativo fallito prima di finalmente speleologia e venire qui è stato ..

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

che produce "preg_match() [function.preg-partita]: No delimitatore finale '^' trovato" come il mio errore. Gli ultimi tentativi di coppia che ho provato hanno prodotto quell'errore, quindi non ho idea di cosa sia o cosa significhi.

+0

Questo sarebbe anche corrispondere 400.00, -700 come una valida lat/lng. – Layke

risposta

21

Aggiungi avanti slash all'inizio e alla fine della sequenza partita per renderlo sintassi regex valida:

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

per la tua domanda sull'opportunità di utilizzare le espressioni regolari (regex) o meno, in questo caso utilizzando regex (PCRE preg_match()) è il modo migliore per proteggere il tuo sito. Quando si abbinano arrangiamenti di stringhe variabili variabili, la regex è la strada da percorrere. È normale che gli sviluppatori si trasformino in espressioni regolari per la corrispondenza con una stringa statica come "abc". Questo è quando strpos() o str_replace() sono scelte migliori.

+0

questo mi mette sulla strada giusta comunque lo sto usando in un'istruzione if .. se questa corrispondenza non è valida dovrei usare! Preg_match o semplicemente preg_match? – chris

+0

@ Chris preg_match restituisce 1 (vero) se viene trovata una corrispondenza, altrimenti 0. Se si desidera verificare se non ha trovato una corrispondenza, l'uso '! Preg_match()' –

+0

@ChrisBornhoft non funziona con -74,052638804 = 3612 –

18

E 'un po' vecchia questione, ma in ogni caso inserisco la mia soluzione qui:

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

ho assunto qui che u dividere lat. da lng. da punto e virgola. Se vuoi controllare solo lat. o solo lng. qui ci sono regexp's;

RGX per lat .:

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

RGX per lng .:

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

Ecco un miglioramento della demo online: https://regex101.com/r/bV5fA1/1

+0

Perché il limite a '80' e' 179'? – Toto

+0

Ho modificato il mio post e modificato i limiti in 89. (9) e 179. (9). Perché? Il punto 179. (9) e -179. (9) sono praticamente gli stessi e consentono di rendere più facile l'uso di rgx. – Doro

+1

Meglio ma non sufficiente, lat 90 e 180 lunghi sono perfettamente validi. – Toto

0

voglio per convalidare latitudine e longitudine, troppo e avere questo risultato:

-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}$ 

Ho testato here con pcre.

+1

Dovresti postare questo come 1 regex per recuperare sia lat che long dalla stessa linea. Inoltre, '[0-9] | [1-9] [0-9]' può essere semplificato come '[1-9]? [0-9]'. – Mariano

0

E 'vero lavoro soluzione unicum in rete " -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}$ 
" 

Per & lat = 90,000 mila & 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

Perché non usare moderno e unità testato Assertion libreria per questo?

Esempio Value Object classe:

<?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; 
    } 

Usage:

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

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

// or simply 

echo $location; 
Problemi correlati