用于验证GPS坐标的JavaScript正则表达式

7

我有一个表单,用户可以在其中插入相应照片的GPS坐标。很容易过滤掉无效的数字,因为只需要测试纬度/经度坐标是否在(-90, 90)、(-180, 180)范围内。

然而,这也意味着普通文本是有效输入。

我尝试更改测试模式为

var pattern= "^[a-zA-Z]" 

并且被用于函数来检测字母字符

$(".lat").keyup(function(){
  var thisID= this.id;
  var num = thisID.substring(3, thisID.length);
  var thisVal = $(this).val();

  //if invalid input, show error message and hide save button
  if (pattern.test(thisVal)){
    $("#latError"+num).fadeIn(250);
    $("#save"+num).fadeOut(100)
  } 
  else { //otherwise, hide error message and show save
    $("#save"+num).fadeIn(250);
    $("#latError"+num).fadeOut(100);
  }
});

然而,这并不起作用,因为Firebug提示pattern.test不是一个函数。如何解决这个问题?

你能提供一个输入和输出的例子吗? - Larry Battle
“[^a-zA-Z]” <- 这个怎么样? - GottZ
@LarryBattle,纬度的有效示例值为43.06982-80.3847。无效的值将大于90或小于-90。 - Jason
@Jan-StefanJanetzky,仍然出现问题。我得到了“pattern.test不是一个函数”的错误。 - Jason
正确答案在这里:var pattern = /[^a-zA-Z]/ - GottZ
5个回答

23

这是我在我的项目中使用的:

const regexLat = /^(-?[1-8]?\d(?:\.\d{1,18})?|90(?:\.0{1,18})?)$/;
const regexLon = /^(-?(?:1[0-7]|[1-9])?\d(?:\.\d{1,18})?|180(?:\.0{1,18})?)$/;

function check_lat_lon(lat, lon) {
  let validLat = regexLat.test(lat);
  let validLon = regexLon.test(lon);
  return validLat && validLon;
}

如果合法,check_lat_lon(-34.11242, -58.11547) 将返回 TRUE,否则返回 FALSE。

我希望这对你有用!


3
最佳解决方案,同时检查-90至90、-180至180范围。应被视为更好的答案,毫无疑问。 - Alex Green
1
我知道我来晚了一点,但为了代码的整洁性,让我们把它写成 return (validLat && validLong) - Kevin Kuyl

18

你需要使用正则表达式吗?考虑以下内容:

var val = parseFloat(lat);
if (!isNaN(val) && val <= 90 && val >= -90)
    return true;
else
    return false;

请注意,在与 NaN 进行比较时,始终会在您的情况下返回 true。请改用 !isNaN(val) - Cyrbil
@Cyrbil。很好的发现。NaN的相等性总是为false。NaN == NaN -> false - Paul Fleming
我刚刚遇到了这个 JavaScript 的无聊问题,但是你也可以通过范围比较来删除 isNaN - Cyrbil

5

那么,如何使用模式-?[0-9]{1,3}[.][0-9]+呢?你可以使用parseInt函数进行解析,并像之前所说的那样检查范围。


1
这不是允许在句点应该出现的位置放置任何字符吗? - Savanaly
3
正则表达式 /^-?[\d]{1,3}[.][\d]+$/ 假设你正在单独检查经度/纬度。 - godfrzero

3

test()RegExp 对象的一个方法 - 你正在对一个字符串运行它,所以会失败。

将你的模式包含在 RegExp 字面量中 (/pattern/),这样就可以:

var pattern= /^[a-zA-Z]/

那将消除你所遇到的错误,但是你仍有一个单独的问题,即:a) 你的模式是否正确完成你想要的功能;b) 是否需要使用正则表达式。
正则表达式作用于字符串,它不能用来确定数字是否在给定范围内(除非该范围包括0-10)。
@flem的答案展示了你正在做的最佳方法——无需使用正则表达式。对parseInt()的调用将捕获非数字字符,因为如果该值包含任何非数字字符,它将返回NaN

0

@paul flemming 给出了一个很好的答案,这个答案扩展了他的答案,并包括经度和使用typescript。 我建议使用它来代替正则表达式,以提高速度和简单性。

由于parseFloat接受一个字符串并返回一个数字,因此不需要isNaN检查。该函数允许一个字符串或一个数字,并将其转换为字符串进行parseFloat,然后对+-90和+-180进行简单的阈值测试。

function isValidLatAndLong(lat: number |string, lon:number|string){
    const num1 = "" +lat; //convert toString
    const num2 = "" +lon;
    if (parseFloat(num1) <= 90 && parseFloat(num1) >= -90 && parseFloat(num2) <= 180 && parseFloat(num2) >= -180){
        return true;
    }
    else{
        return false;
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接