31 Stimmen

Was ist der beste Weg, um zu überprüfen, ob ein String eine URL in Java/Android enthält?

Was ist der beste Weg, um zu überprüfen, ob ein String eine URL in Java/Android enthält? Wäre es am besten zu prüfen, ob der String |.com | .net | .org | .info | .everythingelse| enthält? Oder gibt es eine bessere Methode?

Die URL wird in ein EditText in Android eingegeben, es könnte eine eingefügte URL sein oder es könnte eine manuell eingegebene URL sein, bei der der Benutzer keine Lust hat, http://... einzutippen. Ich arbeite an einer URL-Verkürzungs-App.

41voto

Chandra Punkte 1307

Am besten wäre es, einen regulären Ausdruck zu verwenden, etwa wie unten:

public static final String URL_REGEX = "^((https?|ftp)://|(www|ftp)\\.)?[a-z0-9-]+(\\.[a-z0-9-]+)+([/?].*)?$";

Pattern p = Pattern.compile(URL_REGEX);
Matcher m = p.matcher("example.com");//replace with string to compare
if(m.find()) {
    System.out.println("String contains URL");
}

10voto

Zaid Daghestani Punkte 8485

Dies geschieht einfach mit einem Try-Catch um den Konstruktor herum (dies ist so oder so notwendig).

String inputUrl = getInput();
if (!inputUrl.contains("http://"))
    inputUrl = "http://" + inputUrl;

URL url;
try {
    url = new URL(inputUrl);
} catch (MalformedURLException e) {
    Log.v("myApp", "bad url entered");
}
if (url == null)
    userEnteredBadUrl();
else
    continue();

8voto

Enkk Punkte 376

Nachdem ich mich umgesehen habe, habe ich versucht, Zaids Antwort zu verbessern, indem ich den try-catch-Block entfernt habe. Außerdem werden bei dieser Lösung mehr Muster erkannt, da sie eine Regex verwendet.

Besorgen Sie sich also erst einmal dieses Muster:

// Pattern for recognizing a URL, based off RFC 3986
private static final Pattern urlPattern = Pattern.compile(
    "(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)"
            + "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*"
            + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)",
    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);

Verwenden Sie dann diese Methode (unter der Annahme, dass str ist Ihre Zeichenkette):

    // separate input by spaces ( URLs don't have spaces )
    String [] parts = str.split("\\s+");

    // get every part
    for( String item : parts ) {
        if(urlPattern.matcher(item).matches()) { 
            //it's a good url
            System.out.print("<a href=\"" + item + "\">"+ item + "</a> " );                
        } else {
           // it isn't a url
            System.out.print(item + " ");    
        }
    }

4voto

lxknvlk Punkte 2474

Auf der Grundlage von Enkks Antwort stelle ich meine Lösung vor:

public static boolean containsLink(String input) {
    boolean result = false;

    String[] parts = input.split("\\s+");

    for (String item : parts) {
        if (android.util.Patterns.WEB_URL.matcher(item).matches()) {
            result = true;
            break;
        }
    }

    return result;
}

2voto

ethan123 Punkte 1084

Alte Frage, aber gefunden este Deshalb dachte ich, dass es nützlich sein könnte, sie zu teilen. Sollte für Android helfen...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X