php Проверять строки широты / долготы в десятичном формате

Хорошо, у меня есть то, что я бы назвал массивным списком координат долготы и широты. Тем не менее, у меня также есть несколько источников, из которых я вывожу эти координаты. Некоторые из них поступают из методов get / post, которые могут вызвать потенциальные дыры в безопасности на моем сайте / службе. Поэтому я пытаюсь выяснить, как проверить долготу и широту через PHP. Я думал о регулярном выражении через preg_match. Но я могу ошибаться, может быть, есть более простой способ, который кто-то хотел бы предложить. Я пробовал свои собственные концепции, и я пробовал различные интернет-идеи о том, как пытаться найти шаблон регулярных выражений, который будет проверять их для меня через preg_match (или аналогично, если у вас есть лучшее предложение, я все уши).

Моя последняя неудачная попытка до окончательного обрушения и прихода сюда была.

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

который дает «preg_match () [function.preg-match]: окончательный разделитель« ^ »не найден» как моя ошибка. Последние попытки пары, которые я попытался, дали эту ошибку, поэтому я понятия не имею, что это такое или что означает.

Solutions Collecting From Web of "php Проверять строки широты / долготы в десятичном формате"

Добавьте косые черты в начало и конец последовательности совпадений, чтобы сделать его действительным синтаксисом regex:

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

Для вашего вопроса о том, следует ли использовать регулярные выражения (regex) или нет, в этом случае использование regex (PCRE preg_match() ) – лучший способ защитить ваш сайт. При сопоставлении переменных сложных строковых схем регулярное выражение – это путь. Разработчикам обычно приходится обращаться к регулярному выражению для сопоставления статической строки, такой как «abc». Это когда strpos() или str_replace() – лучший выбор.

Это немного старый вопрос, но в любом случае я размещаю свое решение здесь:

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

Я предположил, что и раскол лат. от lng. по точкам с запятой. Если вы хотите проверить только lat. или только lng. здесь regexp;

Rgx для лат .:

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

Rgx для lng .:

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

Вот улучшенная онлайн-демонстрация: https://regex101.com/r/bV5fA1/1

Почему бы не использовать для этого современную библиотеку Assertion для тестирования?

Пример Значение Класс объекта :

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

Применение:

 $location = new \MyApp\ValueObject\Location(24.7, -20.4059); echo $location->latitude() , ' ' , $location->longitude(); // or simply echo $location; 

Я хочу также утверждать широту и долготу и иметь этот результат:

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

Я тестировал здесь с pcre.

Это реальное решение unicum для работы в сети "-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}$ " 

Для & 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}/"