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 .
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");
}
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();
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 + " ");
}
}
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();
}
}
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
Ancienne question, mais constatée ceci , j’ai donc pensé qu’il pourrait être utile de la partager. Devrait aider pour Android ...
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;
}