假设我有一个网址:
https://example.com/myproject/index-dev.html?_ijt=hsdlgh8h5g8hh489sajoej&a=102&b=a%20m&c=45&d=all&e=all或者它可能是本地主机上的一个网页,如:
localhost:63342/my project/index-dev.html?_ijt=hsdlgh8h5g8hh489sajoej&a=102&b=a%20m&c=45&d=all&e=all我必须提取查询字段(出现在‘?’之后)来自二维数组中的这些urls,如下所示:
_ijt | hsdlgh8h5g8hh489sajoej
a | 102
b | a m
c | 45
d | all
e | all请注意,在“b”字段中,我用空格替换了“%20”。这些字段如_ijt、a、b、c、d、e等,它们的名称(例如a)可以是“城市”。到目前为止,我已经使用正则表达式来提取“?”之后的部分。然后使用拆分(“&”)方法将字符串拆分为多个字符串。密码-
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))产出如下:
_ijt=hsdlgh8h5g8hh489sajoej
a=102
b=a%20m
c=45
d=all
e=all但这似乎不是正确的方法。有什么帮助吗?
发布于 2016-12-06 07:17:01
使用js.URIUtils.decodeURIComponent精确地解码%-encoded字符。
发布于 2016-12-06 07:14:22
您需要对查询参数值调用js.URIUtils.decodeURIComponent:
val fields=temp_url.split("&").map(js.URIUtils.decodeURIComponent)decodeURIComponent是原生Javascript函数,scala.js有简单的接口。
或者,您可以使用一些库来解析用Scala编写的URL。解析URL通常是一种安全隐患,很容易出错。库通常也支持满足相关标准/ RFCs的任何输入。
发布于 2017-08-02 06:05:34
令人惊讶的是,很难找到一个在Scala.js和Scala(jvm)中都能工作的库。java.net.URI将为您提供查询字符串,java.net.URLDecoder.decode将删除URL编码,但我还没有看到任何能为您提供结构良好的查询片段的信息。这不是火箭科学,但它是如此普遍,你会认为你不需要自己写它。
快解析将完成以下工作:
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))
}https://stackoverflow.com/questions/40988504
复制相似问题