2

我正在尝试检索其 URL 将传递给我的脚本的各种网站的大小,但是当我传递一个无效的 URL 时,我没有得到异常,而只是得到一个非常小的页面。我正在使用Source.fromURL,我得到以下结果:

thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway 1052
www.bbc.co.uk 113871

正如它所说,第一个不应该有任何东西,但它确实有。我的脚本如下:

def main( args:Array[String] ){
    val tasks = for(arg <- args) yield future {
        try {
            println(arg + " " + Source.fromURL( attachPrefix(arg) ).length)
        } catch {
            case e : java.net.UnknownHostException => println(arg + " *")
        }
    }

    awaitAll(20000L, tasks: _*)
}

def attachPrefix( url:String ) = url.slice(0, 4) match {
    case "http" => url
    case "www." => "http://" + url
    case _ => "http://www." + url
}

每个参数都被传递到函数attachPrefix中,以确保它在使用之前具有必要的前缀。自从我开始将 url 作为参数传递而不是将其映射arg

args map attachPrefix

两者有什么区别,为什么我现在的人会出现这种行为?

4

1 回答 1

1

您可以使用Source.fromURL(URI)签名。创建一个URI将有效地验证此处URL记录的内容。但是,在这种情况下,就而言是有效的。另一方面,om-nom-nom 的建议认为它无效,因为顶级域段有超过 4 个已经过时的字符。我不知道任何完整的 Scala 验证库或为什么这是一个要求,但您可以尝试使用正则表达式进行验证。例如,这将捕获您的示例,因为顶级域超过 6 个字母:URL http://www.thisIsClearlyABoggusURLThatCantPossiblyLead‌​AnywayURIUrlValidator

val re = """^(https?://)?(([\w!~*'().&=+$%-]+: )?[\w!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([\w!~*'()-]+\.)*([\w^-][\w-]{0,61})?[\w]\.[a-z]{2,6})(:[0-9]{1,4})?((/*)|(/+[\w!~*'().;?:@&=+$,%#-]+)+/*)$""".r
re.pattern.matcher("http://google.com").matches // true
re.pattern.matcher("http://www.thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway").matches // false
于 2013-02-27T22:27:51.767 回答