regex php将经度/纬度字符串转换为十进制格式

xuo3flqw  于 12个月前  发布在  PHP
关注(0)|答案(8)|浏览(142)

好吧,我有一个我称之为大量的经度和纬度坐标列表。也就是说,我也有一些来源,我拉这些坐标。其中一些来自get/post方法,这可能会导致我的网站/服务潜在的安全漏洞。所以我试图找出如何通过PHP验证经度和纬度。我想通过preg_match正则表达式的东西。但我可能是错的,也许有人会建议一个更简单的方法。我已经尝试了我自己的概念,我已经尝试了各种互联网brew的概念,试图找到一个正则表达式模式,将验证这些为我通过preg_match(或类似的,如果你有一个更好的建议,我是所有的耳朵)。
我最后一次失败的尝试之前,终于屈服,来到这里是.

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

字符串
这会产生“preg_match()[function.preg-match]:No ending "^”found“作为我的错误。最后几次尝试我已经尝试产生了这个错误,所以我不知道它是什么或意味着什么。

bkkx9g8r

bkkx9g8r1#

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

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

字符串
我假设你在这里用正则表达式从正则表达式中分离出lat.。如果你只想检查lat.或lat.,这里是正则表达式;
纬度Rgx:

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


Rgx for degree.:

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


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

5f0d552i

5f0d552i2#

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

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

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

bvn4nwqk

bvn4nwqk3#

为什么不使用现代和单元测试的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;


PHP8.2更新:

final readonly class Location implements \Stringable
{
    public function __construct(
        private float $lat,
        private float $lon,
    ) {
        Assertion::greaterOrEqualThan($this->lat, -90.0);
        Assertion::lessOrEqualThan($this->lat, 90.0);
        Assertion::greaterOrEqualThan($this->lon, -180.0);
        Assertion::lessOrEqualThan($this->lon, 180.0);
    }

    public function latitude(): float
    {
        return $this->lat;
    }

    public function longitude(): float
    {
        return $this->lon;
    }

    public function __toString(): string
    {
        return $this->lat . ' ' . $this->lon;
    }
}

9fkzdhlc

9fkzdhlc4#

我也想验证纬度和经度,结果如下:
-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}$


我用PCRE测试了here

ioekq8ef

ioekq8ef5#

正则表达式

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

字符串

vecaoik1

vecaoik16#

验证Latitude的功能

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_';
    }

}

xtfmy6hx

xtfmy6hx7#

它是真实的工作unicum解决方案在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}$
"

字符串
对于&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}/"

vsmadaxz

vsmadaxz8#

这些看起来不太准确,因为:
纬度在-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

字符串

相关问题