Php Проверять строки широты/долготы в десятичном формате
Хорошо, у меня есть то, что я бы назвал массивным списком координат долготы и широты. Тем не менее, у меня также есть несколько источников, из которых я вывожу эти координаты. Некоторые из них поступают из методов get/post, которые могут вызвать потенциальные дыры в безопасности на моем сайте/службе. Поэтому я пытаюсь выяснить, как проверить долготу и широту через PHP. Я думал о регулярном выражении через preg_match. Но я могу ошибаться, может быть, есть более простой способ, который кто-то хотел бы предложить. Я пробовал свои собственные концепции, и я пробовал различные интернет-концепции brew, пытаясь найти шаблон регулярных выражений, который будет проверять их для меня через preg_match (или аналогично, если у вас есть лучшее предложение, я все уши).
Моя последняя неудачная попытка до окончательного обрушения и прихода сюда была.
preg_match('^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$', $geoResults['latitude']))
который дает "preg_match() [function.preg-match]: Конечный разделитель '^' found" как моя ошибка. Последние попытки пары, которые я попытался, дали эту ошибку, поэтому я понятия не имею, что это такое или что означает.
Ответы
Ответ 1
Добавьте косые черты в начало и конец последовательности совпадений, чтобы сделать его допустимым синтаксисом regex:
preg_match('/^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$/', $geoResults['latitude']);
Для вашего вопроса о том, следует ли использовать регулярные выражения (регулярное выражение) или нет, в этом случае с использованием regex (PCRE preg_match()
) является лучший способ защитить ваш сайт. При сопоставлении переменных сложных строковых схем регулярное выражение - это путь. Обычно разработчикам приходится обращаться к регулярному выражению для сопоставления статической строки, такой как "abc". Это когда strpos()
или str_replace()
лучше выбор.
Ответ 2
Это немного старый вопрос, но в любом случае я размещаю свое решение здесь:
preg_match('/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?);[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/', $geoResults['latlng']);
Я предположил, что u split lat. от lng. по точкам с запятой. Если вы хотите проверить только lat. или только lng. здесь regexp's;
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
Ответ 3
Почему бы вам не использовать современные и проверенные с помощью модуля Assertion для этого?
Пример Объект Value:
<?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;
Ответ 4
Я хочу также проверить широту и долготу и получить этот результат:
-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.
Ответ 5
Это реальное решение 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}/"
Ответ 6
регулярное выражение
/([0-9.-]+).+?([0-9.-]+)/
Ответ 7
Функция для проверки Локатора
function validateLatitude($lat) {
$lat_array = explode( '.' , $lat );
if( sizeof($lat_array) !=2 ){
return '_n_';
}
if ( ! ( is_numeric($lat_array[0]) && $lat_array[0]==round($lat_array[0], 0) && is_numeric($lat_array[1]) && $lat_array[1]==round($lat_array[1], 0) ) ){
return '_n_';
}
if( $lat >= -90 && $lat <= 90 ){
return '_s_';
}
else {
return '_n_';
}
}
Функция для проверки долготы
function validateLongitude($long) {
$long_array = explode( '.' , $long );
if( sizeof($long_array) !=2 ){
return '_n_';
}
if (!( is_numeric($long_array[0]) && $long_array[0]==round($long_array[0], 0) && is_numeric($long_array[1]) && $long_array[1]==round($long_array[1], 0) ) ){
return '_n_';
}
if( $long >= -180 && $long <= 180 ){
return '_s_';
}
else {
return '_n_';
}
}