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

2022-08-30 16:27:11

好吧,我有一个我称之为经度和纬度坐标的大量列表。也就是说,我也有一些来源,我从中提取这些坐标。其中一些来自获取/发布方法,这些方法可能会导致我的站点/服务中存在潜在的安全漏洞。因此,我正在尝试弄清楚如何通过PHP验证经度和纬度。我通过preg_match思考一些正则表达式。但我可能是错的,也许有人想建议一种更简单的方法。我已经尝试了自己的概念,并且尝试了各种互联网酿造概念,试图找到一个正则表达式模式,该模式将通过preg_match为我验证这些概念(或者如果你得到更好的建议,我再次类似,我都是耳朵)。

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

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

这会产生“ preg_match() [function.preg-match]:没有发现结束分隔符'^'作为我的错误。我尝试过的最后几次尝试产生了该错误,因此我不知道它是什么或意味着什么。


答案 1

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

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

我在这里假设你从lng中分离出纬度。由分号。如果您只想检查纬度或仅 lng。这里是正则表达式的;

Rgx for lat.:

/^[-]?(([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


答案 2

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

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

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


推荐