You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby应用验证OpenStreetMap openingHours格式的技术方案咨询

嘿,我刚好对OpenStreetMap的openingHours格式验证有过研究,针对你的Ruby应用场景,给你整理几个可行的方案:

可行的验证方案

1. 现成的Ruby Gem

  • 推荐opening_hours这个gem,它专门针对OSM的openingHours格式做解析和验证,不仅能检查格式合法性,还能帮你解析出具体的营业时间规则,处理各种复杂场景(比如节假日、特殊时段例外)。
    • 使用步骤:
      1. 在Gemfile里添加:gem 'opening_hours'
      2. 执行bundle install完成安装
      3. 验证代码示例:
        require 'opening_hours'
        
        # 测试你的示例格式
        hours_str = "Mo, Tu, We, Th, Fr, Sa 10:00-18:00 Su 12:00-17:00"
        begin
          oh = OpeningHours.parse(hours_str)
          puts "格式合法!"
          # 还能拓展功能,比如检查某个时间是否营业
          # puts "今天14点是否营业?#{oh.open?(Time.now)}"
        rescue OpeningHours::ParseError => e
          puts "格式不合法:#{e.message}"
        end
        
    • 这个gem完全遵循OSM的官方规范,比自己折腾正则靠谱多了,生产环境用它准没错。

2. REST API替代方案

如果你暂时不想引入gem,也可以调用你提到的在线验证工具背后的API。不过要注意,这个API没有公开的官方文档,是通过分析工具的请求逻辑找到的,稳定性可能有风险,不建议在生产环境大规模使用。

  • Ruby请求示例(用faraday gem实现):
    require 'faraday'
    
    conn = Faraday.new(url: "http://openingh.openstreetmap.de") do |faraday|
      faraday.adapter Faraday.default_adapter
    end
    
    response = conn.post("/evaluation_tool/index.php") do |req|
      req.params['opening_hours'] = "Mo, Tu, We, Th, Fr, Sa 10:00-18:00 Su 12:00-17:00"
    end
    
    # 解析响应中的验证结果(需要处理返回的HTML内容,提取错误提示或验证状态)
    puts response.body
    

3. 正则表达式(仅适合简单场景)

如果只是做最基础的格式校验,不想依赖外部库,可以用一个基础正则,但它只能覆盖常见的简单格式,对于带例外、节假日、时段间隔的复杂规则完全无能为力:

basic_opening_hours_regex = /^([A-Za-z]{2}(?:, [A-Za-z]{2})* \d{2}:\d{2}-\d{2}:\d{2}(?: )?)+$/

hours_str = "Mo, Tu, We, Th, Fr, Sa 10:00-18:00 Su 12:00-17:00"
if basic_opening_hours_regex.match?(hours_str)
  puts "基础格式匹配通过"
else
  puts "格式不符合要求"
end
  • 总结:正则只适合快速简单校验,复杂场景一定要用gem。

内容的提问来源于stack exchange,提问作者Leti Esperón

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:06:33