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

php验证十进制格式的纬度/经度字符串,php,regex,Php,Regex,好的,我有一个我称之为经纬度坐标的大列表。也就是说,我也有一些来源,我从中提取这些坐标。其中一些来自get/post方法,这可能会在我的站点/服务中造成潜在的安全漏洞。因此,我试图找出如何通过PHP验证经度和纬度。我在想通过preg_match的一些正则表达式。但我可能错了,也许有人会建议一个更简单的方法。我尝试过我自己的概念,我也尝试过各种internet brew概念,试图找到一种正则表达式模式,通过preg_match为我验证这些模式(如果你有更好的建议,我洗耳恭听,也可以类似) 在最终屈

好的,我有一个我称之为经纬度坐标的大列表。也就是说,我也有一些来源,我从中提取这些坐标。其中一些来自get/post方法,这可能会在我的站点/服务中造成潜在的安全漏洞。因此,我试图找出如何通过PHP验证经度和纬度。我在想通过preg_match的一些正则表达式。但我可能错了,也许有人会建议一个更简单的方法。我尝试过我自己的概念,我也尝试过各种internet brew概念,试图找到一种正则表达式模式,通过preg_match为我验证这些模式(如果你有更好的建议,我洗耳恭听,也可以类似)

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

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

这将产生“preg_match()[function.preg match]:未找到结尾分隔符“^”作为我的错误。我最近几次尝试都产生了这个错误,所以我不知道这是什么意思

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

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

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

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

preg_match('/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?);[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/', $geoResults['latlng']);
我在这里假设你从液化天然气中分离lat。用分号。如果您只想检查纬度或液化天然气。这里是regexp的

用于lat的Rgx:

/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/
液化天然气的Rgx:

/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/
这是一个改进的在线演示:

我也想验证纬度和经度,并得到以下结果:

-90.0000-90.0000

^-?([0-9]|[1-8][0-9]|90)\.{1}\d{4}$
^-?([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}$
"
-180.0000-180.0000

^-?([0-9]|[1-9][0-9]|1[0-7][0-9]|180)\.{1}\d{4}$

我已经用pcre进行了测试。

这是网络中真正的unicum解决方案 " -90.0000-90.0000

^-?([0-9]|[1-8][0-9]|90)\.{1}\d{4}$
^-?([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}/"

为什么不使用现代的、经过单元测试的库呢

示例类:

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

}
函数验证相关性($lat){
$lat_数组=分解('.',$lat);
if(sizeof($lat_数组)!=2){
返回“_n_”;
}
如果(!(是数值($lat_数组[0])&$lat_数组[0]==round($lat_数组[0],0])&&is_数值($lat_数组[1])&&$lat_数组[1]==round($lat_数组[1],0))){
返回“_n_”;
}

如果($lat>=-90&&$lat=-180&&$long,这让我走上了正确的轨道,但是我在if语句中使用了它。如果此匹配无效,我应该使用!preg_match还是只是preg_match?@chris preg_match在找到匹配时返回1(true),否则返回0。如果要检查是否找到匹配,请使用
!preg_match()
@ChrisBornhoft未使用-74.052638804=3612@OscarDavid如果使用
=
作为分隔符(同样,3612不是有效的lat/lng),您需要修改表达式以反映这一点。它不是分隔符…它是一个错误的经度,但表达式没有检测到错误。这也将匹配400.00,-700作为有效的lat/lng。为什么限制在
80
179
?我已编辑我的帖子,并将限制更改为89.(9)和179.(9).为什么?因为第179点(9)和-179点(9)是非常相似的,它可以使rgx更容易。更好但不充分,lat 90和long 180是完全有效的。再次编辑。现在lat 90和lng 180将是有效的;)谢谢你的建议。好的,+1但你应该在
(.0+)中避开该点
。您应该将其作为1个正则表达式发布,以便从同一行获取lat和long。此外,
[0-9]|[1-9][0-9]
可以简化为
[1-9]?[0-9]
。请为您的答案添加解释
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_';
    }

}