Как определить, содержит ли строка PHP ТОЛЬКО широту и долготу - PullRequest
4 голосов
/ 27 февраля 2010

Мне нужно работать со строками, которые могут содержать данные широты и долготы, например:

$query = "-33.805789,151.002060";
$query = "-33.805789, 151.002060";
$query = "OVER HERE: -33.805789,151.002060";

Для моих целей первые 2 строки верны, а последняя - нет. Я пытаюсь определить шаблон соответствия, который будет соответствовать лат и длинная, разделенные запятой или запятой и пробелом. Но если в строке есть что-то, кроме цифр, пробелов, точек, знаков минус и запятых, то совпадение должно произойти.

Надеюсь, что это имеет смысл, и TIA!

Ответы [ 4 ]

10 голосов
/ 27 февраля 2010
^[+-]?\d+\.\d+, ?[+-]?\d+\.\d+$

^ в начале и $ в конце убедитесь, что оно соответствует всей строке, а не только ее части.

2 голосов
/ 27 февраля 2010

Проще всего решить с помощью регулярного выражения, как это предлагается в других ответах. Вот пошаговый подход, который тоже будет работать:

$result = explode(",", $query);  // Split the string by commas
$lat = trim($result[0]);         // Clean whitespace
$lon = trim($result[1]);         // Clean whitespace

if ((is_numeric($lat)) and (is_numeric($lon))) echo "Valid coordinates!";

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

 "-33.805789,151.002060,ABNSBOFVJDPENVÜE";

пройдет нормально.

Как правильно заметил Фрэнк Фармер, is_numeric также распознает научные обозначения.

0 голосов
/ 27 февраля 2010

Подход регулярного выражения не может действительно подтвердить, что долгота и широта действительны, но вот тот, который был бы более точным, чем другие, опубликованные уже:

/^\s*-?\d{1,3}\.\d+,\s*\d{1,3}\.\d+\s*$/

Это отклонит некоторые строки, которые позволят решения других, такие как

-1-23-1-,210-
--123.1234,123.1234

Но он по-прежнему допускает недопустимые значения, подобные этому:

361.1234, 123.1234

Лучше всего - если вам нужна серьезная проверка - создать класс для хранения и проверки этих координат.

0 голосов
/ 27 февраля 2010
/^-*\d*\.\d+,[\b]*-*\d*\.\d+$/
...