【问题标题】:Parse out user agent the scala way in Play2 application在 Play2 应用程序中以 scala 方式解析用户代理
【发布时间】:2013-08-12 13:45:03
【问题描述】:

我正在尝试为我的控制器编写一个辅助方法来确定设备是否是移动的,以便我可以加载适当的模板。 这是我到目前为止得到的:

def isMobile[A](implicit request: Request[A]): Boolean = {
    request.headers.get("User-Agent").exists(agent =>
      if (agent.matches("/(iPhone|webOS|iPod|Android|BlackBerry|mobile|SAMSUNG|IEMobile|OperaMobi)/"))
        true
      else false)
  }

这不起作用,因为用户代理不仅向我们提供设备,而且向我们提供字符串 包含很多好东西,例如:

Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25

解析此信息的正确方法是什么?我是否应该使用用户代理创建一个字典并查看当前字符串是否包含其中一个?创建一个匹配不同用户代理的主要疯狂正则表达式?也许有一些我没有发现的 scala 库可以做到这一点?

谢谢!

【问题讨论】:

  • 我对 scala 一无所知,但是否有一些匹配模式允许全局匹配,或者换句话说,在整个用户代理字符串中查找您的单词之一?
  • 是的,谢谢您指出这一点。下面看看我的回答。也许还有其他更好的方法?

标签: regex scala playframework user-agent playframework-2.1


【解决方案1】:

按照 Sniffer 的建议,一种方法当然是与 unanchored 进行部分匹配,如下所示:

val Pattern = "(iPhone|webOS|iPod|Android|BlackBerry|mobile|SAMSUNG|IEMobile|OperaMobi)".r.unanchored

  def isMobile[A](implicit request: Request[A]): Boolean = {
    request.headers.get("User-Agent").exists(agent => {
      agent match {
        case Pattern(a) => true
        case _ => false
      }
    })
  }

也许还有其他更好的方法?

【讨论】:

  • 我在写同样的解决方案,所以 +1。
【解决方案2】:

使用 jakob 回答中的模式,也许将函数重写为:

def isMobile[A](implicit request: Request[A]): Boolean =
  request.headers.get("User-Agent") match {
    case Some(Pattern(a)) => true
    case _ => false
  }

如果您更喜欢使用字符串:

def isMobile(ua: String) =
  ua match {
    case uaMobilePattern(a) => true
    case _ => false
}

【讨论】:

    【解决方案3】:

    您可以使用https://github.com/ua-parser/uap-scala

    它基于https://github.com/ua-parser/uap-core,其中包含许多语言的库使用的数据。它的核心是https://github.com/ua-parser/uap-core/blob/master/regexes.yaml,看起来很全面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2011-04-07
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      相关资源
      最近更新 更多