Skip to content

Instantly share code, notes, and snippets.

@arubacao
Last active February 10, 2024 00:55
Show Gist options
  • Save arubacao/b5683b1dab4e4a47ee18fd55d9efbdd1 to your computer and use it in GitHub Desktop.
Save arubacao/b5683b1dab4e4a47ee18fd55d9efbdd1 to your computer and use it in GitHub Desktop.
Latitude Longitude Regular Expression Validation PHP
<?php
/**
* Validates a given latitude $lat
*
* @param float|int|string $lat Latitude
* @return bool `true` if $lat is valid, `false` if not
*/
function validateLatitude($lat) {
return preg_match('/^(\+|-)?(?:90(?:(?:\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\.[0-9]{1,6})?))$/', $lat);
}
/**
* Validates a given longitude $long
*
* @param float|int|string $long Longitude
* @return bool `true` if $long is valid, `false` if not
*/
function validateLongitude($long) {
return preg_match('/^(\+|-)?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$/', $long);
}
/**
* Validates a given coordinate
*
* @param float|int|string $lat Latitude
* @param float|int|string $long Longitude
* @return bool `true` if the coordinate is valid, `false` if not
*/
function validateLatLong($lat, $long) {
return preg_match('/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?),[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/', $lat.','.$long);
}
$tests = [
'lat' => [
'0.0','+90.0','-90.0','90.0','+45','-45','45','50','55.55','45,1','A',],
'long' => [
'0.0', '180', '-180', '+180', '179.9', 'A',
],
'lat_long' => [
'90.0,180.0',
'47.1,179.1',
'90.1a,180.1a'
]
];
echo "\033[37;44m:::::::::::: Tests ::::::::::::\033[0m".PHP_EOL;
echo "\033[1mType:\t\tValue:\tResult\033[0m".PHP_EOL;
foreach ($tests['lat'] as $lat) {
echo "Latitude:\t$lat\t\t".((validateLatitude($lat)) ? "\033[32mMATCH\033[0m" : "\033[31mFAIL\033[0m").PHP_EOL;
}
foreach ($tests['long'] as $long) {
echo "Longitude:\t$long\t\t".((validateLongitude($long)) ? "\033[32mMATCH\033[0m" : "\033[31mFAIL\033[0m").PHP_EOL;
}
foreach ($tests['lat_long'] as $lat_long) {
$geo = explode(",", $lat_long);
echo "Lat,Long:\t$lat_long\t".((validateLatLong($geo[0],$geo[1])) ? "\033[32mMATCH\033[0m" : "\033[31mFAIL\033[0m").PHP_EOL;
}
@paulvancity
Copy link

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

I removed the comma and it still returns 1, is there a way to have it so it fails if no comma?

@Bazzly
Copy link

Bazzly commented Mar 10, 2022

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

I removed the comma and it still returns 1, is there a way to have it so it fails if no comma?

Maybe you should try and elaborate on what the problem is .

@mancy-gif
Copy link

but it is not valid in the case of "--",
I used this regex but it accepted"--78798989898" case which is wrong, Can anyone suggest me something?

@Bazzly
Copy link

Bazzly commented May 2, 2022

but it is not valid in the case of "--", I used this regex but it accepted"--78798989898" case which is wrong, Can anyone suggest me something?

can you tell me the format of the result you want to obtain?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment