Ruby应用验证OpenStreetMap openingHours格式的技术方案咨询
嘿,我刚好对OpenStreetMap的openingHours格式验证有过研究,针对你的Ruby应用场景,给你整理几个可行的方案:
可行的验证方案
1. 现成的Ruby Gem
- 推荐
opening_hours这个gem,它专门针对OSM的openingHours格式做解析和验证,不仅能检查格式合法性,还能帮你解析出具体的营业时间规则,处理各种复杂场景(比如节假日、特殊时段例外)。- 使用步骤:
- 在Gemfile里添加:
gem 'opening_hours' - 执行
bundle install完成安装 - 验证代码示例:
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
- 在Gemfile里添加:
- 这个gem完全遵循OSM的官方规范,比自己折腾正则靠谱多了,生产环境用它准没错。
- 使用步骤:
2. REST API替代方案
如果你暂时不想引入gem,也可以调用你提到的在线验证工具背后的API。不过要注意,这个API没有公开的官方文档,是通过分析工具的请求逻辑找到的,稳定性可能有风险,不建议在生产环境大规模使用。
- Ruby请求示例(用
faradaygem实现):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
相关产品推荐
相关产品推荐

