4

我正在从源中提取地址,但某些提取物在地址前面没有 http://,我如何检查地址是否有 http://,如果他们没有,我如何添加 http:// 前面?:O

得到这个错误,我猜是由于 http://infront 的“缺乏”

java.net.MalformedURLException: no protocol: www.speedtest.net
at java.net.URL.<init>(URL.java:583)
at java.net.URL.<init>(URL.java:480)
at java.net.URL.<init>(URL.java:429)
at a.PageRead.r(PageRead.java:29)
at a.ThreadDownloaderWriter.run(ThreadDownloaderWriter.java:35)
at java.lang.Thread.run(Thread.java:722)






 public StringBuilder readPage() {
        try {

            URL url = new URL(this.strURL);
            System.out.println(this.strURL);
            BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
            String line;
            StringBuilder sb = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            reader.close();

            return sb;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return new StringBuilder("");
        } catch (IOException e) {
            e.printStackTrace();
            return new StringBuilder("");
        }
    }
4

6 回答 6

19

您的问题的字面答案如下所示:

String url = ... ; // Whatever
if (!url.startsWith("http://")) {
    url = "http://" + url;
}

但这仍然不是一个很好的解决方案。例如,httpsURLS 呢?ftp 甚至文件系统 URL ( file://) 怎么样。然后你可能想考虑区分大小写之类的事情(“ http://”!=“ HTTP://”!=“ HttP://”即使实际上它们都表示相同的东西并且会被Java的URL类接受)。

您可以尝试更加小心:

if (!url.toLowerCase().matches("^\\w+://.*")) {
    url = "http://" + url;
}

这会将 URL 字符串的开头与后跟冒号 ( :) 和两个斜线 ( //) 的任何“单词字符”匹配,然后将其默认为http://如果 URL 的协议部分丢失。这将涵盖比原始(字面)答案更多的案例。

最终,如果有人给你一个没有协议部分的 URL,它就是一个无效的 URL。

你应该考虑买一本关于 Java 编程的书,因为这些都是基本的逻辑/Java API 问题。

于 2012-07-30T16:47:32.090 回答
6

startsWith()您可以使用以下方法检查地址是否以“http://”开头:

url.startsWith("http://");

true如果是这种情况,它会返回。

您可能是正确的,缺少“http://”是问题所在。该文档似乎表明该协议(此处为http)是强制性的。

于 2012-07-30T16:46:59.017 回答
2

好吧,根据我在调用之前所说的堆栈跟踪new URL(your_url),检查是否your_urlhttp://https://ftp://或您认为需要检查的任何其他协议开头:

if(!your_url.startsWith("http://")) 

如果缺少,your_url.

your_url = "http://" + your_url;

你认为这个错误是由 http:// 引起的吗?——</p>

是的,在您的堆栈跟踪中:

java.net.MalformedURLException: no protocol: www.speedtest.net

你有一个 urlwww.speedtest.net并且它必须是http://www.speedtest.net. 该错误是由缺少协议引起的。或者,它不必是http://,只是一个有效的协议,如https://,file://等。

于 2012-07-30T16:47:34.663 回答
2
String url = "www.speedtest.net"
if (!url.toLowerCase().startsWith("http://")) url = "http://" + url

然而,这并不适用于所有情况,因为某些网站可能有 https:// 或其他协议。

于 2012-07-30T16:48:17.787 回答
1

当前投票最高的答案包含不正确的正则表达式。下面的解决方案将匹配任何协议,大写或小写:

if (!url.matches("^\\w+?://.*")) {
  url = "http://" + url;
}
于 2013-05-24T09:33:43.347 回答
0
String s = "www.google.com";

Pattern p = Pattern.compile("http://");

Matcher m = p.matcher(s);

if (m.lookingAt()){


  System.out.println("Its already there");

}
else{

       String ss = "http://"+s;

       System.out.println(ss);

 }
于 2012-07-30T16:59:29.180 回答