Как определить, содержит ли строка PHP ТОЛЬКО широту и долготу

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

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

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

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


person Alexia    schedule 27.02.2010    source источник


Ответы (3)


^[+-]?\d+\.\d+, ?[+-]?\d+\.\d+$

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

person Wim    schedule 27.02.2010
comment
О, извините, я никогда не видел этого раньше ... не знал, что есть чек, лол! - person Alexia; 27.02.2010
comment
Это регулярное выражение не соответствует -33, 151, которые являются допустимыми координатами. - person chelmertz; 28.02.2010
comment
Я знаю, что в текущей версии должен быть ., чтобы он работал. Если вы хотите, чтобы . был необязательным и соответствовал всем 30, 30.4 и .4, вы можете использовать \d*\.?\d+. - person Wim; 28.02.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 также распознает экспоненциальную нотацию.

person Pekka    schedule 27.02.2010
comment
Выглядит немного проще, чем регулярное выражение... ;-) - person Wim; 27.02.2010
comment
Вы забыли разделитель в explode: explode(',', $query) - person Wim; 27.02.2010
comment
is_numeric более либерален, чем вам хотелось бы, во многих случаях. is_numeric('1e6') возвращает bool(true), потому что распознает его как экспоненциальное представление - person Frank Farmer; 27.02.2010
comment
Спасибо, но это не сработало бы для меня, потому что в строке может даже не быть запятой, это может быть просто текст. - person Alexia; 27.02.2010
comment
@ Алексия Я вижу, я перечитал это. Ваши требования могут быть помещены в этот код, но регулярное выражение сделает это более элегантно, я думаю, что в этом случае вам следует использовать регулярное выражение. - person Pekka; 27.02.2010

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

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

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

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

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

361.1234, 123.1234

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

person Mark E. Haase    schedule 27.02.2010
comment
Спасибо! Я тоже попробую это... Причина, по которой мне это нужно, состоит в том, чтобы просто проверить правильность поиска широты/долготы. Затем я отправляю их реальному геокодеру, и он фактически проверяет их на предмет реального местоположения. Просто хочу ограничить объем данных, которые я отправляю в геокодер. - person Alexia; 27.02.2010