我有一个巨大的经纬度坐标列表。也就是说,我也有一些坐标的来源。其中一些来自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