Хорошо, у меня есть то, что я бы назвал массивным списком координат долготы и широты. Тем не менее, у меня также есть несколько источников, из которых я вывожу эти координаты. Некоторые из них поступают из методов get / post, которые могут вызвать потенциальные дыры в безопасности на моем сайте / службе. Поэтому я пытаюсь выяснить, как проверить долготу и широту через PHP. Я думал о регулярном выражении через preg_match. Но я могу ошибаться, может быть, есть более простой способ, который кто-то хотел бы предложить. Я пробовал свои собственные концепции, и я пробовал различные интернет-идеи о том, как пытаться найти шаблон регулярных выражений, который будет проверять их для меня через preg_match (или аналогично, если у вас есть лучшее предложение, я все уши).
Моя последняя неудачная попытка до окончательного обрушения и прихода сюда была.
preg_match('^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$', $geoResults['latitude']))
который дает «preg_match () [function.preg-match]: окончательный разделитель« ^ »не найден» как моя ошибка. Последние попытки пары, которые я попытался, дали эту ошибку, поэтому я понятия не имею, что это такое или что означает.
Добавьте косые черты в начало и конец последовательности совпадений, чтобы сделать его действительным синтаксисом 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}/"