2011-08-18 8 views
6

jestem pozwalając użytkownikom wprowadzić wartości GPS za pośrednictwem formularza, wszystkie one mają taką samą formę, kilka przykładów:Co wyrażenie regex sprawdzi wartości GPS?

49.082243,19.302628 

48.234142,19.200423 

49.002524,19.312578 

Chcę sprawdzić wprowadzoną wartość za pomocą PHP (przy użyciu preg_match(), chyba), ale jako Nie jestem dobry w wyrażeń regexowych (o, głupku, w końcu powinienem się tego nauczyć, wiem), nie wiem, jak napisać wyrażenie.

Oczywiście należy:
2x (liczby), 1x (DOT), 6x (liczby), 1x (przecinek), 2x (liczby), 1x (DOT), 6x (liczby)

Dowolny sugestie jak to napisać w regex?

Odpowiedz

10

Coś jak:

/^(-?\d{1,2}\.\d{6}),(-?\d{1,2}\.\d{6})$/ 
  • ^ kotwice na początku wejścia
  • -? dopuszcza, ale nie wymaga, znak ujemny
  • \d{1,2} wymaga 1 lub 2 cyfry dziesiętne
  • \. wymaga kropki dziesiętnej
  • \d{6} wymaga dokładnie 6 cyfr dziesiętnych
  • , dopasowuje pojedynczy przecinek
  • (powtórz 5 pierwszych kul)
  • $ kotwice na końcu wejście

mam włączone przechwytywanie nawiasy, aby umożliwić wyodrębnić indywidualne współrzędne. Jeśli ich nie potrzebujesz, możesz je pominąć.

wszystko wokół użyteczne odniesienie regex: http://www.regular-expressions.info/reference.html

+1

Pamiętaj, że jedna wartość GPS to obie te wartości oddzielone przecinkami. –

+0

Ah! Mój błąd, zaktualizuję. –

+0

+1 za dodatkowe wyjaśnienie –

1

Rozszerzanie po drugiej odpowiedź:

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

innych odpowiedzi widzę nie biorą pod uwagę, że długość geograficzna idzie od -180 do 180 i szerokość geograficzna wynoszą od -90 do 90.

Właściwym wyliczeniem tego będzie (zakładając, że kolejność to "szerokość i długość geograficzna"):

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

To wyrażenie regularne obejmuje mające nie mniej niż -90 i nie większe niż 90 ° szerokości geograficznej, a także nie mniej niż -180 i nie większa niż 180 dla długości, pozwalając jednocześnie, aby umieścić je w liczbach, jak również wszelkie liczba miejsc dziesiętnych od 1 do 6, jeśli chcesz pozwolić na większą precyzję, po prostu zmień {1,6} na {1, x}, gdzie x to liczba miejsc dziesiętnych

Ponadto, jeśli zrobisz zdjęcie w grupie 1, uzyskać szerokość geograficzną, a przechwytywanie w grupie 2 ma długość geograficzną.

0

Bazując na swoim przykładzie, będzie to zrobić:

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

Objaśnienie:

(   # 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 
Powiązane problemy