2011-09-26 54 views
18

好吧我有我所說的經度和緯度座標的海量列表。這就是說,我也有一些資源我從這些座標中提取出來。其中一些來自get/post方法,這可能會在我的網站/服務中導致潛在的安全漏洞。所以我想弄清楚如何通過PHP驗證經度和緯度。我正在通過preg_match思考一些正則表達式。但我可能錯了,也許有人想提出一個更簡單的方法。我嘗試了自己的概念,嘗試了各種互聯網釀造的概念,試圖找到一個正則表達式模式,通過preg_match來驗證這些模式(如果你有更好的建議,我會再次類似)。php驗證十進制格式的緯度/經度字符串

我上次失敗的嘗試終於放之前在和來這裏是..

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

這將產生「的preg_match()[function.preg匹配]:沒有結束符‘^’發現」我的錯誤。我試過的最後幾次嘗試產生了這個錯誤,所以我不知道它是什麼或意思。

+0

這也匹配400.00,-700爲是有效的緯度/經度。 – Layke

回答

21

添加斜線的開始和匹配序列的末端,使之有效的正則表達式語法:使用正則表達式

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

有關是否使用正則表達式(正則表達式),或者不是你的問題,在這種情況下, (PCRE preg_match())是保護您的網站的最佳方式。當匹配變量複雜的字符串安排時,正則表達式就是要走的路。開發人員通常使用正則表達式匹配靜態字符串,例如'abc'。這是當strpos()str_replace()是更好的選擇。

+0

這讓我在正確的軌道上,但是我在if語句中使用它。如果此匹配無效,我應該使用preg_match還是preg_match? – chris

+0

@chris preg_match在找到匹配的情況下返回1(真),否則返回0.如果要檢查是否找不到匹配項,請使用'!preg_match()' –

+0

@ChrisBornhoft不與-74.052638804 = 3612 –

18

這是一個有點老問題,但無論如何,我在這裏發佈我的解決方案:

preg_match('/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?);[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/', $geoResults['latlng']); 

我這裏假設ü緯度分裂。來自lng。用分號分隔。如果你只想檢查拉特。或只有lng。這裏是正則表達式的;

RGX爲緯度:

/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/ 

RGX液化天然氣:

/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/ 

下面是一個經過改進的在線演示: https://regex101.com/r/bV5fA1/1

+0

爲什麼限制在'80'和'179'? – Toto

+0

我編輯了我的貼子並將限制更改爲89.(9)和179(9)。爲什麼?由於第179點(9)和-179。(9)非常相似,它可以使rgx變得更容易。 – Doro

+1

更好但不夠完美,lat 90和long 180是完全有效的。 – Toto

0

我想驗證緯度和經度,太,並有這樣的結果:

-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}$ 

我已經測試here與PCRE。

+1

你應該把它作爲1個正則表達式從同一行中取出lat和long。另外,'[0-9] | [1-9] [0-9]'可以簡化爲'[1-9]?[0-9]'。 – Mariano

0

它在淨 「 -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}/" 
1

爲什麼不使用現代和單元測試Assertion庫是什麼?

Value Object類:

<?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; 
相關問題