Как определить, содержит ли строка PHP ТОЛЬКО широту и долготу
Мне приходится работать со строками, которые могут содержать данные Lat/Long, например:
$query = "-33.805789,151.002060";
$query = "-33.805789, 151.002060";
$query = "OVER HERE: -33.805789,151.002060";
Для моих целей первые 2 строки верны, но последняя - нет. Я пытаюсь найти шаблон соответствия, который соответствовал бы широте и длине, разделенным запятой, или запятой и пробелом. Но если в строке есть что-то, кроме цифр, пробелов, точек, знаков минус и запятых, то совпадение должно быть неудачным.
Надеюсь, это имеет смысл, и ТИА!
4 answers
^[+-]?\d+\.\d+, ?[+-]?\d+\.\d+$
^
в начале и $
в конце убедитесь, что он соответствует полной строке, а не только ее части.
Проще всего решить с помощью регулярного выражения, как предложено в других ответах. Вот пошаговый подход, который тоже будет работать:
$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
также распознает научную нотацию.
/^-*\d*\.\d+,[\b]*-*\d*\.\d+$/
Подход с использованием регулярных выражений на самом деле не может подтвердить правильность долготы и широты, но вот один из них, который был бы более точным, чем другие, уже опубликованные:
/^\s*-?\d{1,3}\.\d+,\s*\d{1,3}\.\d+\s*$/
Это отвергло бы некоторые строки, которые допускали бы другие решения, такие как
-1-23-1-,210-
--123.1234,123.1234
Но это все равно допускало бы недопустимые значения, подобные этому:
361.1234, 123.1234
Ваш лучший выбор - если вам нужна серьезная проверка - это создать класс для хранения и проверки этих координат.