Coordinaten regex

Status
Niet open voor verdere reacties.

bn2vs

Terugkerende gebruiker
Lid geworden
18 aug 2007
Berichten
1.705
Hey,

Ik heb een functie die een string parameter ontvancht met coordinaten (1 paar) of address derin . Nu moet die functie een boolean terug geven die aanduit of het coordinaten zijn ofniet.

Ik vermoed dat dit best gedaan kan worden met een regex. Spijtig genoeg ben ik echt niet goed op weg met regexes, en is dit niet echt iets vooriemand die er pas mee begint.

De coordinaten mmoeten in 2 verschillende vormen herkend worden:
* floating point: 55.7557860, 37.6176330
* DMS notation: 55°45′06″N 37°37′04″E

Coordinaten met niet alle decimalen moeten ook herkend worden, dus bijvoorbeeld:
* 55, 37.6176330
* 55, 37
* 55°45′N 37°04″E

Code, links naar code, of gewoon suggesties met hoe ik ermee begin zijn welkom :)

Cheers
Jeroen De Dauw
 
Het beste kun je preg_match() gebruiken aangezien ereg() deprecated is.

Je zult vermoedelijke 2x een expressie moeten maken, een voor de floating point en een voor de DMS.

Elke notatie heeft zo z'n eigen specifieke karakters welke er in voor moeten komen.
Bij de floating point zijn is dat altijd de komma en soms de punt
Dus dit is de minimale conditie waar een FP aan moet voldoen:

PHP:
^\d{1,3},\d{1,3}$
Wat er nu staat is dit:

Vanaf het begin (^) van de string moet er eerst een minimaal 1 getal en maximaal 3 staan (\d{1,3}) dan moet er een komma komen (,) en daarna weer minimaal 1 getal en maximaal 3 (\d{1,3}) vervolgens is de string aan het eind ($)

Bruikbare links:
http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/
http://www.pagecolumn.com/tool/pregtest.htm
 
Hey,

Ik ben ff aan het uitproberen geweest, en ik krijg deze warning als ik jouw code gebruik:

Warning: preg_match() [function.preg-match]: No ending delimiter '^' found in U:\Workspace\Server\Root\regex.php on line 5
false


Als ik een ^ toevoeg als laatste char in de regex string gaat die warning weg.

Ik heb momenteel deze regex:

PHP:
"^\d{1,3}\.\d{0,7},(| )\d{1,3}\.\d{0,7}$^"

Zijn enkele dingen die nier werken. In de eerste groep digits (dus deze 55.7557860, 337.6176330) kan ik zoveel digits plaatsen als ik wil, en ik kan er zelf chars zetten :shocked:

Enig idee wat daar verkeerd gaat? Nog verdere opmerkingen op die regex?

Cheers!
Jeroen De Dauw
 
Oh, blijkbaar zijn begin en einde verkeerd, dit werkt wel :)

PHP:
"/^\d{1,3}\.\d{0,7},(| )\d{1,3}\.\d{0,7}$/"
 
Ok, denk dat ik nu 2 'redelijke' regexes heb :)

Op het eerste gezicht lijken ze te werken, maar misschien kunnen ze ergens een stuk beter/korter?

Floating point coordinate regex:

PHP:
/^\d{1,3}\.\d{0,7},(| )\d{1,3}\.\d{0,7}$/

DMS coordinate regex:

PHP:
/^(\d{1,2}°)(\d{2}')?((\d{2}\")?|(\d{2}\.\d{2}\")?)(N|S)(| )(\d{1,2}°)(\d{2}')?((\d{2}\")?|(\d{2}\.\d{2}\")?)(E|W)$/

Cheers!
Jeroen De Dauw
 
Heb je de regexp-tester geprobeerd? Deze genereert ook PHP-code ;)

PHP:
<?php 
$ptn = "/^\d{1,3},\d{1,3}$/";
$str = "35,35";
preg_match($ptn, $str, $matches);
print_r($matches);
?>

Dit is je minimale eis: 35,55
PHP:
^\d{1,3},\d{1,3}$
Maar het is ook mogelijk dat dit voorkomt: 35.1234567,55
Dan gebruik je dit:
PHP:
^\d{1,3}(|\.\d{1,7}),\d{1,3}$
Uiteraard ook de andere kant en de spatie na de komma kan er zijn ds krijg je dit voor de floating point:
PHP:
^\d{1,3}(|\.\d{1,7}),(|\s)\d{1,3}(|\.\d{1,7})$
 
Heb je de regexp-tester geprobeerd? Deze genereert ook PHP-code ;)

Nee, ik heb geopteerd om het op mn eigen server te testen, om zeker te zijn dat er geen verschil zit tussen PHP versie enzo.

Thnx voor het duiden op die domme fout in mn float regex :)

Cheers!
Jeroen De Dauw
 
Ah jij had in de tussentijd nog gereageerd :)

Je weet dat jouw FP-expressie niet met mogelijkheden rekenen houdt (hield)

Die van jou ging hier vanuit: 35.1234567,54.1234567
Bij 35, 54.1234567 gaat ie op z'n bek.

De DMS wel als ik zo gauw kijk :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan