2011-09-26 43 views
18

Được rồi, tôi có cái mà tôi gọi là danh sách vĩ độ kinh tuyến và vĩ độ. Điều đó nói rằng tôi cũng có một số ít các nguồn tôi kéo các tọa độ này từ đó. Một số trong số đó đến từ các phương thức get/post có thể gây ra các lỗ hổng bảo mật tiềm ẩn trên trang web/dịch vụ của tôi. Vì vậy, tôi đang cố gắng tìm ra cách để xác nhận kinh độ và vĩ độ thông qua PHP. Tôi đã suy nghĩ một cái gì đó regex thông qua preg_match. Nhưng tôi có thể sai, có lẽ có một cách dễ dàng hơn một người nào đó muốn đề nghị. Tôi đã thử các khái niệm của riêng mình, và tôi đã thử các khái niệm về internet khác nhau của việc cố gắng tìm một mẫu regex sẽ xác nhận cho tôi thông qua preg_match (hoặc tương tự một lần nữa nếu bạn có một gợi ý tốt hơn tôi là tất cả tai).php Xác thực các chuỗi vĩ độ/kinh độ theo định dạng thập phân

My cuối không thành công nỗ lực trước khi cuối cùng thám hiểm hang động và sắp tới đây được ..

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

trong đó sản lượng "preg_match() [function.preg-match]: Không có kết thúc delimiter '^' tìm thấy" như tôi lỗi. Vài lần thử cuối cùng tôi đã thử mang lại lỗi đó vì vậy tôi không biết nó là gì hoặc có nghĩa là gì.

+0

này sẽ cũng phù hợp với 400,00, -700 như là một giá trị lat/lng. – Layke

Trả lời

21

Thêm dấu gạch chéo để bắt đầu và kết thúc chuỗi trận đấu để làm cho nó cú pháp regex hợp lệ:

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

Đối với câu hỏi của bạn về việc có nên sử dụng biểu thức thông thường (regex) hay không, trong trường hợp này sử dụng regex (PCRE preg_match()) là cách tốt nhất để bảo mật trang web của bạn. Khi phù hợp với sắp xếp chuỗi phức tạp biến, regex là con đường để đi. Nó phổ biến cho các nhà phát triển để chuyển sang regex cho phù hợp với một chuỗi tĩnh như 'abc'. Đây là khi strpos() hoặc str_replace() là lựa chọn tốt hơn.

+0

điều này được tôi đi đúng hướng tuy nhiên tôi đang sử dụng nó trong một tuyên bố nếu .. nếu trận đấu này là không hợp lệ nên tôi đang sử dụng! Preg_match hoặc chỉ preg_match? – chris

+0

@chris preg_match trả về 1 (đúng) nếu một kết quả được tìm thấy, nếu không 0. Nếu bạn muốn kiểm tra xem nó có tìm thấy kết quả trùng khớp không, sử dụng '! Preg_match()' –

+0

@ChrisBornhoft không hoạt động với -74.052638804 = 3612 –

18

Đó là một câu hỏi hơi cũ, nhưng dù sao tôi gửi giải pháp của tôi ở đây:

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

tôi cho rằng đây là u chia lat. từ lng. bằng dấu chấm phẩy. Nếu bạn chỉ muốn kiểm tra lat. hoặc chỉ lng. đây là regexp's;

Rgx cho lat .:

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

Rgx cho lng .:

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

Dưới đây là một cải tiến demo trực tuyến: https://regex101.com/r/bV5fA1/1

+0

Tại sao giới hạn ở '80' và' 179'? – Toto

+0

Tôi đã chỉnh sửa bài đăng của mình và thay đổi các giới hạn thành 89. (9) và 179. (9). Tại sao? Trở thành điểm 179. (9) và -179. (9) là khá giống nhau và nó cho phép làm cho rgx dễ dàng hơn. – Doro

+1

Tốt hơn nhưng không suficient, lat 90 và dài 180 là hoàn toàn hợp lệ. – Toto

0

Tôi muốn xác vĩ độ và kinh độ, quá và có kết quả này:

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

Tôi đã thử nghiệm here với PCRE.

+1

Bạn nên đăng bài này dưới dạng 1 regex để tìm nạp cả lat và dài từ cùng một dòng. Ngoài ra, '[0-9] | [1-9] [0-9]' có thể được đơn giản hóa thành '[1-9]? [0-9]'. – Mariano

0

Đó là công việc thực tế giải pháp Unicum trong net " -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}$ 
" 

Đối & 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

Tại sao không sử dụng thư viện hiện đại và thử nghiệm đơn vị Assertion?

Ví dụ Value Object lớp:

<?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; 
    } 

Cách sử dụng:

$location = new \MyApp\ValueObject\Location(24.7, -20.4059); 

echo $location->latitude() , ' ' , $location->longitude(); 

// or simply 

echo $location; 
Các vấn đề liên quan