首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从scala中的url中提取字段

从scala中的url中提取字段
EN

Stack Overflow用户
提问于 2016-12-06 05:35:32
回答 6查看 1.3K关注 0票数 4

假设我有一个网址:

代码语言:javascript
运行
复制
https://example.com/myproject/index-dev.html?_ijt=hsdlgh8h5g8hh489sajoej&a=102&b=a%20m&c=45&d=all&e=all

或者它可能是本地主机上的一个网页,如:

代码语言:javascript
运行
复制
localhost:63342/my project/index-dev.html?_ijt=hsdlgh8h5g8hh489sajoej&a=102&b=a%20m&c=45&d=all&e=all

我必须提取查询字段(出现在‘?’之后)来自二维数组中的这些urls,如下所示:

代码语言:javascript
运行
复制
_ijt    |    hsdlgh8h5g8hh489sajoej
a       |    102
b       |    a m
c       |    45
d       |    all
e       |    all

请注意,在“b”字段中,我用空格替换了“%20”。这些字段如_ijt、a、b、c、d、e等,它们的名称(例如a)可以是“城市”。到目前为止,我已经使用正则表达式来提取“?”之后的部分。然后使用拆分(“&”)方法将字符串拆分为多个字符串。密码-

代码语言:javascript
运行
复制
val url=localhost:63342/my project/index-dev.html?_ijt=hsdlgh8h5g8hh489sajoej&a=102&b=a%20m&c=45&d=all&e=all
val pattern="""(http|htpps)([A-Za-z0-9\:\/\%\-\.]*)\?""".r
val temp_url=pattern.replaceFirstIn(url,"")
val fields=temp_url.split("&")
println(fields.foreach(println))

产出如下:

代码语言:javascript
运行
复制
_ijt=hsdlgh8h5g8hh489sajoej
a=102
b=a%20m
c=45
d=all
e=all

但这似乎不是正确的方法。有什么帮助吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-12-06 07:17:01

使用js.URIUtils.decodeURIComponent精确地解码%-encoded字符。

票数 5
EN

Stack Overflow用户

发布于 2016-12-06 07:14:22

您需要对查询参数值调用js.URIUtils.decodeURIComponent

代码语言:javascript
运行
复制
val fields=temp_url.split("&").map(js.URIUtils.decodeURIComponent)

decodeURIComponent原生Javascript函数,scala.js有简单的接口

或者,您可以使用一些库来解析用Scala编写的URL。解析URL通常是一种安全隐患,很容易出错。库通常也支持满足相关标准/ RFCs的任何输入。

票数 2
EN

Stack Overflow用户

发布于 2017-08-02 06:05:34

令人惊讶的是,很难找到一个在Scala.js和Scala(jvm)中都能工作的库。java.net.URI将为您提供查询字符串,java.net.URLDecoder.decode将删除URL编码,但我还没有看到任何能为您提供结构良好的查询片段的信息。这不是火箭科学,但它是如此普遍,你会认为你不需要自己写它。

快解析将完成以下工作:

代码语言:javascript
运行
复制
  val url = new java.net.URI("http://example.com/?a=1&b%20=b+is+2&c=#someAnchor?a=b")
  println(s"query string is: ${url.getQuery}")

  val individualElements =
    P(CharsWhile {
      case '&' | '=' | '#' => false
      case _ => true
    }.!.map(x => java.net.URLDecoder.decode(x, "UTF-8")))

  val keyValuePair: core.Parser[(String, Option[String]), Char, String] =
    individualElements ~ "=" ~ individualElements.?

  val pairs: core.Parser[Seq[(String, Option[String])], Char, String] =
    keyValuePair.rep(sep = "&")

  val parsed: Parsed[Seq[(String, Option[String])], Char, String] =
    pairs.parse(url.getQuery)

  parsed match {
    case Success(items, _) => println(s"items: ${items.toList}")
    // prints:
    // items: List((a,Some(1)), (b ,Some(b is 2)), (c,None))
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40988504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档