好的,我有一个巨大的经度和纬度坐标列表。也就是说,我也有几个来源,我从那里拉出这些坐标。其中一些来自get/post方法,这可能会导致我的站点/服务中存在潜在的安全漏洞。因此,我正在尝试弄清楚如何通过PHP验证经度和纬度。我在想通过preg_match的正则表达式。但我可能错了,也许有人会提出一种更简单的方法。我已经尝试了我自己的概念,我尝试了各种互联网brew概念,试图找到一个正则表达式模式,通过preg_match为我验证这些概念(或者,如果你有更好的建议,我洗耳恭听的话,也是类似的)。
我最后一次失败的尝试是在最终投降并来到这里之前..
preg_match('^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$', $geoResults['latitude']))
这将产生“preg_match() function.preg-match:找不到结尾分隔符'^‘”作为我的错误。我尝试过的最后几次尝试都产生了这个错误,所以我不知道它是什么或者是什么意思。
发布于 2011-09-26 08:51:05
在匹配序列的开头和结尾添加正斜杠,以使其有效的正则表达式语法:
preg_match('/^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$/', $geoResults['latitude']);
对于您是否使用正则表达式(正则表达式)的问题,在这种情况下,使用正则表达式(PCRE preg_match()
)是保护站点的最佳方法。当匹配可变的复杂字符串排列时,regex是最佳选择。开发人员通常会求助于正则表达式来匹配静态字符串,例如“abc”。此时,strpos()
或str_replace()
是更好的选择。
发布于 2014-02-25 15:18:09
这是一个有点老的问题,但不管怎样,我在这里发布了我的解决方案:
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。下面是regexp;
Rgx用于以后。:
/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/
用于lng的Rgx:
/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/
这是一个改进的在线演示:https://regex101.com/r/bV5fA1/1
发布于 2016-07-19 18:52:11
为什么不使用现代的、经过单元测试的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;
https://stackoverflow.com/questions/7549669
复制相似问题