Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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_';
    }

}