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.

1voto

John Watts Punkte 8531

Ich würde zunächst java.util.Scanner verwenden, um URL-Kandidaten in der Benutzereingabe zu finden, wobei ich ein sehr dummes Muster verwende, das zwar falsch-positive, aber keine falsch-negativen Ergebnisse liefert. Dann verwenden Sie etwas wie die von @ZedScio gegebene Antwort, um sie herauszufiltern. Zum Beispiel,

Pattern p = Pattern.compile("[^.]+[.][^.]+");
Scanner scanner = new Scanner("Hey Dave, I found this great site called blah.com you should visit it");
while (scanner.hasNext()) {
    if (scanner.hasNext(p)) {
        String possibleUrl = scanner.next(p);
        if (!possibleUrl.contains("://")) {
            possibleUrl = "http://" + possibleUrl;
        }

        try {
            URL url = new URL(possibleUrl);
            doSomethingWith(url);
        } catch (MalformedURLException e) {
            continue;
        }
    } else {
        scanner.next();
    }
}

1voto

Ram Iyer Punkte 1501

Wenn Sie nicht mit regulären Ausdrücken experimentieren und eine getestete Methode ausprobieren wollen, können Sie die Apache Commons Library verwenden und überprüfen, ob eine gegebene Zeichenkette ein URL/Hyperlink ist oder nicht. Unten ist das Beispiel.

Bitte beachten Sie: In diesem Beispiel soll festgestellt werden, ob ein bestimmter Text als Ganzes eine URL ist. Bei einem Text, der eine Kombination aus regulärem Text und URLs enthält, muss möglicherweise ein zusätzlicher Schritt durchgeführt werden, bei dem die Zeichenkette auf der Grundlage von Leerzeichen aufgespalten und das Array in einer Schleife durchlaufen wird, um jedes Array-Element zu überprüfen.

Gradle-Abhängigkeit:

implementation 'commons-validator:commons-validator:1.6'

Code:

import org.apache.commons.validator.routines.UrlValidator;

// Using the default constructor of UrlValidator class
public boolean URLValidator(String s) {
    UrlValidator urlValidator = new UrlValidator();
    return urlValidator.isValid(s);
}

// Passing a scheme set to the constructor
public boolean URLValidator(String s) {
    String[] schemes = {"http","https"}; // add 'ftp' is you need
    UrlValidator urlValidator = new UrlValidator(schemes);
    return urlValidator.isValid(s);
}

// Passing a Scheme set and set of Options to the constructor
public boolean URLValidator(String s) {
    String[] schemes = {"http","https"}; // add 'ftp' is you need. Providing no Scheme will validate for http, https and ftp
    long options = UrlValidator.ALLOW_ALL_SCHEMES + UrlValidator.ALLOW_2_SLASHES + UrlValidator.NO_FRAGMENTS;
    UrlValidator urlValidator = new UrlValidator(schemes, options);
    return urlValidator.isValid(s);
}

// Possible Options are:
// ALLOW_ALL_SCHEMES
// ALLOW_2_SLASHES
// NO_FRAGMENTS
// ALLOW_LOCAL_URLS

Um mehrere Optionen zu verwenden, fügen Sie sie einfach mit dem Operator '+' hinzu

Wenn Sie bei der Verwendung der Apache-Commons-Bibliothek Abhängigkeiten auf Projektebene oder transitive Abhängigkeiten im Grad ausschließen müssen, können Sie wie folgt vorgehen (Entfernen Sie alles, was erforderlich ist, aus der Liste):

implementation 'commons-validator:commons-validator:1.6' {
    exclude group: 'commons-logging'
    exclude group: 'commons-collections'
    exclude group: 'commons-digester'
    exclude group: 'commons-beanutils'
}

Weitere Informationen können Sie über den Link abrufen.

http://commons.apache.org/proper/commons-validator/dependencies.html

0voto

Ketan Ramani Punkte 3908

Diese Funktion funktioniert bei mir

private boolean containsURL(String content){
    String REGEX = "\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
    Pattern p = Pattern.compile(REGEX,Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(content);
    return m.find();
}

Aufruf dieser Funktion

boolean isContain = containsURL("Pass your string here...");
Log.d("Result", String.valueOf(isContain));

HINWEIS :- Ich habe einen String getestet, der eine einzelne URL enthält

0voto

Psijic Punkte 574

Sie müssen Folgendes verwenden URLUtil isNetworkUrl(url) o isValidUrl(url)

0voto

Mohammed Sadiq Punkte 11
public boolean isURL(String text) {
    return text.length() > 3 && text.contains(".")
            && text.toCharArray()[text.length() - 1] != '.' && text.toCharArray()[text.length() - 2] != '.'
            && !text.contains(" ") && !text.contains("\n");
}

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