2016-12-06 2 views
3

가정하자 나는했습니다 URL을 같은 :추출 필드 스칼라-JS

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 

내가 추출했습니다 쿼리 필드 (후 나타나는 '?') 2 차원 배열에서 해당 URL에서 다음과 같이

_ijt | hsdlgh8h5g8hh489sajoej 
a  | 102 
b  | a m 
c  | 45 
d  | all 
e  | all 

'B'필드의 점에 유의 마십시오, 내가 '% 20'을 대체 한 위스콘신 공간. _ijt, a, b, c, d, e 등과 같은 필드는 번호와 이름이 다를 수 있습니다. 예를 들어 'a'는 '도시'일 수 있습니다. 지금까지 정규 표현식을 사용하여 '?'뒤에 부분을 추출했습니다. split ("&") 메서드를 사용하여 문자열을 여러 문자열로 분할합니다.

_ijt=hsdlgh8h5g8hh489sajoej 
a=102 
b=a%20m 
c=45 
d=all 
e=all 

그러나이 작업을 수행하는 올바른 방법이 될 것 같지 않습니다 - 코드

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)) 

출력이다. 어떤 도움이 필요합니까?

답변

1

당신은 쿼리 매개 변수 값에 js.URIUtils.decodeURIComponent를 호출해야합니다

val fields=temp_url.split("&").map(js.URIUtils.decodeURIComponent) 

decodeURIComponentnative Javascript function이다,하는 a simple interface있다 scala.js.

또는 스칼라로 작성된 URL을 구문 분석하기 위해 일부 라이브러리를 사용할 수 있습니다. URL 구문 분석은 종종 보안 상 위험하므로 실수를 저지르기 쉽습니다. 또한 라이브러리는 일반적으로 관련 표준/RFC를 충족하는 모든 입력을 지원합니다.

3

js.URIUtils.decodeURIComponent을 사용하면 % 인코딩 된 문자를 정확하게 디코딩 할 수 있습니다.

+0

그것은, 내가 = #의 clinic' 다음은'엔진을 보여줄 것이다'바람직하지 않은 모든 #의 clinic'을 추가 '는 %의 20m'의 문제를 해결하지만, URL의 끝에 같아요. 또한'fields.foreach (println)'을 사용하여 필드를 인쇄해야합니다. 하지만 각 필드를 별도의 변수에 저장하려고합니다. 이것을 어떻게 할 수 있습니까? – Ishan

+2

'java.net.URI'를 사용하면 이와 같은 URL을 신뢰할 수있게 파싱 할 수 있습니다. Scala.js가 지원합니다 ('java.net.URL'는 없습니다). – sjrd

0

놀랍게도 Scala.js와 Scala (jvm)에서 모두 작동하는 모든 것을위한 라이브러리를 찾기가 어렵습니다. java.net.URI는 쿼리 문자열을 가져오고 java.net.URLDecoder.decode는 URL 인코딩을 제거하지만 멋지게 구조화 된 쿼리 조각을 얻는 것을 본 적이 없습니다. 그것은 로켓 과학이 아니지만, 당신이 직접 쓰지 않아도된다고 생각하는 것이 일반적입니다.

Fastparse이 일 할 것 "java.net.URI의"나는이 신속하고 더러운 솔루션을 함께했다 "decodeURIComponent"과를 사용하도록 제안에

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)) 
    } 
0

건물을 거의 확실하게 개선 될 수 있지만, 아마도 도움 :

def getUrlParameters(url: String): Map[String, Array[String]] = { 
    java.net.URI.create(url).getQuery.split('&').map(js.URIUtils.decodeURIComponent).map { p => 
     val split = p.split('=') 
     (split.head, split.tail.mkString("=")) 
    }.groupBy(_._1).map(m => m._1 -> m._2.map(_._2)) 
} 

def getUrlParameter(url: String, parameter: String): Option[String] = { 
    getUrlParameters(url).get(parameter).flatMap(_.headOption) 
}