php如何判断变量为经纬度数据_php经纬度格式检测法【示例】

发布时间 - 2026-02-01 00:00:00    点击率:
正则可快速校验经纬度格式合法性,纬度范围-90.0~90.0、经度-180.0~180.0,小数点后1~6位;但需配合floatval转换与数值边界判断,防止字符串绕过。

如何用正则快速校验经纬度字符串是否合法

直接用正则判断最轻量,适合表单提交前的初步过滤。但要注意:正则只能验证格式,不能保证地理合理性(比如 999.999 语法合法但显然无效)。

纬度范围是 -90.090.0,经度是 -180.0180.0,且支持带符号、小数点后最多 6 位(常见精度需求):

// 纬度正则(含边界)
$latRegex = '/^[-+]?([0-8]?\d(\.\d{1,6})?|90(\.0{1,6})?)$/';

// 经度正则(含边界)
$lngRegex = '/^[-+]?((1[0-7]\d|180)(\.\d{1,6})?|([0-9]?\d(\.\d{1,6})?))$/';

// 示例检测
$lat = "39.9042";
$lng = "116.4074";
var_dump(preg_match($latRegex, $lat) && preg_match($lngRegex, $lng)); // true
  • 必须用 ^$ 锚定,否则 "abc123.45" 这类也会被误判
  • 小数点后位数建议限制在 1-6 位:太多无实际意义,太少(如只允许 1 位)会拒绝有效数据
  • 不推荐用 \d+ 替代具体数字范围,否则无法控制值域(如 190.1 会被 ^-?\d+\.\d+$ 放过)

用 floatval + 范围判断更稳妥的运行时校验

正则之后,务必转为浮点数再做数值边界检查——这是防止字符串绕过(如 "+00000039.9042" 或科学计数法 "3.99042e1")的关键一步。

function isValidLatLon($latStr, $lngStr) {
    $lat = floatval($latStr);
    $lng = floatval($lngStr);
    
    return is_finite($lat) && is_finite($lng)
        && $lat >= -90.0 && $lat <= 90.0
        && $lng >= -180.0 && $lng <= 180.0;
}

// 注意:floatval("123.45abc") → 123.45,所以仍需前置正则或 trim+is_numeric 防干扰
  • is_finite() 必须加,否则 INF-INFNAN 会通过范围判断
  • floatval() 对空格、前导符号、指数形式兼容性好,比 (float) 强制转换更鲁棒
  • 如果输入可能含单位(如 "39.9042°N"),先用 preg_replace('/[^-\d.]+/', '', $str) 清洗

处理常见脏数据:空值、null、数组、对象

真实接口或表单中,变量可能是 null、空字符串、数组甚至对象,直接丢给正则或 floatval 会出警告或返回意外值。

// 安全提取和转换
function extractLatLon($data) {
    if (!is_array($data)) {
        return [null, null];
    }
    $lat = $data['lat'] ?? $data['latitude'] ?? null;
    $lng = $data['lng'] ?? $data['longitude'] ?? null;

    // 转字符串再清洗,避免对非标类型调用 floatval 报 Notice
    $lat = is_scalar($lat) ? trim((string)$lat) : '';
    $lng = is_scalar($lng) ? trim((string)$lng) : '';

    return [$lat, $lng];
}
  • 永远假设输入不可信,用 ??is_scalar() 做兜底
  • 不要依赖 isset() 判断数组键存在就安全——isset($arr['lat'])$arr['lat'] = null 返回 false,但该键实际存在且值为 null
  • 若原始数据是 GeoJSON 格式(如 ["lng", "lat"] 数组),注意经纬度顺序是反的,需交换

为什么不用 filter_var(FILTER_VALIDATE_FLOAT)?

filter_var($val, FILTER_VALIDATE_FLOAT) 看似简洁,但有严重缺陷:它只验证是否能转成浮点数,完全不检查值域。例如 filter_var("999.999", FILTER_VALIDATE_FLOAT) 返回 999.999,而这不是合法纬度。

  • 它也无法识别带空格或单位的字符串(" 39.9042 " 可以,但 "39.9042°" 不行)
  • 1e2+123 等格式支持不稳定,不同 PHP 版本行为可能不一致
  • 没有提供小数位数控制,必须额外用 strlen(strrchr(...)) 拆解判断,反而更复杂

真正要省事又可靠,还是正则 + floatval + 边界检查三步组合——少一个环节都可能漏掉边缘 case。


# php  # 表单提交  # Float  # NULL  # strlen  # filter_var  # 字符串  # 接口  # 对象  # 值域  # 表单  # 这是  # 浮点数  # 太多  # 也会  # 最多  # 这类  # 而这  # 太少 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在云主机上快速搭建多站点网站?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  再谈Python中的字符串与字符编码(推荐)  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何在云指建站中生成FTP站点?  焦点电影公司作品,电影焦点结局是什么?  网站页面设计需要考虑到这些问题  实例解析angularjs的filter过滤器  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  如何在服务器上配置二级域名建站?  Laravel如何实现模型的全局作用域?(Global Scope示例)  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  历史网站制作软件,华为如何找回被删除的网站?  如何在万网开始建站?分步指南解析  python中快速进行多个字符替换的方法小结  如何快速搭建虚拟主机网站?新手必看指南  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel如何处理CORS跨域请求?(配置示例)  香港服务器网站卡顿?如何解决网络延迟与负载问题?  详解jQuery中的事件  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  微信小程序 HTTPS报错整理常见问题及解决方案  EditPlus中的正则表达式 实战(4)  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel如何使用Livewire构建动态组件?(入门代码)  高端企业智能建站程序:SEO优化与响应式模板定制开发  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何快速选择适合个人网站的云服务器配置?  jQuery中的100个技巧汇总  JS中对数组元素进行增删改移的方法总结  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  用v-html解决Vue.js渲染中html标签不被解析的问题  java ZXing生成二维码及条码实例分享  如何彻底删除建站之星生成的Banner?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  高端网站建设与定制开发一站式解决方案 中企动力  如何在 React 中条件性地遍历数组并渲染元素  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何用y主机助手快速搭建网站?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Linux安全能力提升路径_长期防护思维说明【指导】  详解MySQL数据库的安装与密码配置