web-dev-qa-db-fra.com

Quel est le meilleur moyen de vérifier si une chaîne contient une URL en Java/Android?

Quel est le meilleur moyen de vérifier si une chaîne contient une URL en Java/Android? Le meilleur moyen serait-il de vérifier si la chaîne contient | .com | .net | .org | .info | .everythingelse |? Ou y a-t-il une meilleure façon de le faire?

L'URL est entrée dans un EditText dans Android, il peut s'agir d'une URL collée ou d'une URL saisie manuellement où l'utilisateur n'a pas envie de taper http: // ... Je travaille sur une application de réduction d'URL .

18
William L.

Le meilleur moyen serait d'utiliser une expression régulière, comme ci-dessous:

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");
}
28
Chandra

Ceci est simplement fait avec un test try autour du constructeur (c'est nécessaire dans les deux cas).

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();
9
Zaid Daghestani

Après avoir regardé autour de moi, j'ai essayé d'améliorer la réponse de Zaid en supprimant le bloc try-catch. De plus, cette solution reconnaît plus de motifs car elle utilise une expression régulière.

Donc, premièrement, obtenez ce modèle:

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

Ensuite, utilisez cette méthode (en supposant que str est votre chaîne):

    // 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 + " ");    
        }
    }
3
Enkk

Je voudrais d’abord utiliser Java.util.Scanner pour rechercher des URL candidates dans l’entrée utilisateur à l’aide d’un modèle très stupide qui produira des faux positifs, mais pas de faux négatifs. Ensuite, utilisez quelque chose comme la réponse fournie par @ZedScio pour les filtrer. Par exemple,

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();
    }
}
1
John Watts

Cette fonction fonctionne pour moi

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);
    if(m.find()) {
        return true;
    }

    return false;
}

Appeler cette fonction 

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

NOTE: - J'ai testé une chaîne contenant une seule URL

0
Ketan Ramani

Ancienne question, mais constatée ceci , j’ai donc pensé qu’il pourrait être utile de la partager. Devrait aider pour Android ...

0
ethan123

Sur la base de la réponse d'Enkk, je présente ma solution:

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;
}
0
lxknvlk