验证十进制格式的经纬度字符串



我有一个巨大的经纬度坐标列表。也就是说,我也有一些坐标的来源。其中一些来自get/post方法,这可能会在我的网站/服务中造成潜在的安全漏洞。所以我试图弄清楚如何通过PHP验证经度和纬度。我在想一些regex通过preg_match。但我可能错了,也许有人会建议一个更简单的方法。我已经尝试了我自己的概念,我已经尝试了各种互联网酿造的概念,试图找到一个regex模式,将验证这些为我通过preg_match(或类似,如果你有一个更好的建议,我洗耳洗耳)。

在最终屈服并来到这里之前,我最后一次失败的尝试是…

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

产生"preg_match()[函数。没有找到结束分隔符"^"作为我的错误。最后几次尝试,我已经尝试产生了这个错误,所以我不知道它是什么或意味着什么。

这是一个有点老的问题,但无论如何我张贴我的解决方案在这里:

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

我在这里假设u分裂较晚。从液化天然气。分号。如果你只想在晚些时候检查。或者只有lng。下面是正则表达式

Rgx for late .:

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

Rgx for lng.:

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

这是一个改进的在线演示:https://regex101.com/r/bV5fA1/1

在匹配序列的开头和结尾添加正斜杠,使其符合正则表达式语法:

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

对于您是否使用正则表达式(regex)或不使用的问题,在这种情况下,使用regex (PCRE preg_match())是保护您的网站的最佳方法。当匹配可变的复杂字符串排列时,regex是可行的方法。开发人员通常会使用正则表达式来匹配静态字符串,如'abc'。这是当strpos()str_replace()是更好的选择

为什么不使用现代的单元测试断言库呢?

对象类:
<?php
namespace MyAppValueObject;
use AssertAssertion;
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 MyAppValueObjectLocation(24.7, -20.4059);
echo $location->latitude() , ' ' , $location->longitude();
// or simply
echo $location;

我也想验证纬度和经度,并得到这样的结果:

- 90000 - 90000

^-?([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}$

我在这里用pcre进行了测试。

regex

/([0-9.-]+).+?([0-9.-]+)/

验证纬度的函数

function validateLatitude($lat) {

    $lat_array = explode( '.' , $lat );
    if( sizeof($lat_array) !=2 ){
        return '_n_';
    }
    if ( ! ( is_numeric($lat_array[0]) && $lat_array[0]==round($lat_array[0], 0) && is_numeric($lat_array[1]) && $lat_array[1]==round($lat_array[1], 0)  ) ){
        return '_n_';
    }
    if( $lat >= -90 && $lat <= 90 ){
        return '_s_';
    }
    else {
        return '_n_';
    }
}
验证经度 的函数
function validateLongitude($long) {
    $long_array = explode( '.' , $long );
    if( sizeof($long_array) !=2 ){
        return '_n_';
    }
    if (!( is_numeric($long_array[0]) && $long_array[0]==round($long_array[0], 0) && is_numeric($long_array[1]) && $long_array[1]==round($long_array[1], 0)  ) ){
        return '_n_';
    }
    if( $long >= -180 && $long <= 180 ){
        return '_s_';
    }
    else {
        return '_n_';
    }
}

这是一个真正的网络工作解决方案"- 90000 - 90000

^-?([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}$
"

For & l00 =90.000000 & l00 =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}/"

这些看起来不太准确,

纬度在-90和90之间

经度在-180到90度之间

d在正则表达式中匹配多于[0-9]

一个完整的库只是为了一些正则表达式似乎不合乎逻辑…

所以我构建并测试了:

//Latitude
if(preg_match('/^-?(90|[1-8][0-9][.][0-9]{1,20}|[0-9][.][0-9]{1,20})$/', '89.33333')) {
                            echo "<br>a match<br>"; 
} //will pass ->89.33333

//Longitude
if(preg_match('/^-?(180|1[1-7][0-9][.][0-9]{1,20}|[1-9][0-9][.][0-9]{1,20}|[0-9][.][0-9]{1,20})$/', '180.33333')) {
                            echo "<br>b match<br>"; 
} // will fail anything over 180 ->180.33333

最新更新