Как да определите дали 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
@Alexia Разбирам, препрочетох това. Вашите изисквания могат да бъдат поставени в този код, но регулярен израз би направил това по-елегантно, мисля, че трябва да отидете с регулярен израз в този случай. - 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