Je n'ai aimé aucune des implémentations (parce qu'elles utilisent un Regex qui est une opération coûteuse, ou une bibliothèque qui est une surcharge si vous n'avez besoin que d'une seule méthode), donc j'ai fini par utiliser la classe java.net.URI avec quelques vérifications supplémentaires, et en limitant les protocoles à : http, https, file, ftp, mailto, news, urn.
Et oui, attraper les exceptions peut être une opération coûteuse, mais probablement pas aussi mauvaise que les expressions régulières :
final static Set<String> protocols, protocolsWithHost;
static {
protocolsWithHost = new HashSet<String>(
Arrays.asList( new String[]{ "file", "ftp", "http", "https" } )
);
protocols = new HashSet<String>(
Arrays.asList( new String[]{ "mailto", "news", "urn" } )
);
protocols.addAll(protocolsWithHost);
}
public static boolean isURI(String str) {
int colon = str.indexOf(':');
if (colon < 3) return false;
String proto = str.substring(0, colon).toLowerCase();
if (!protocols.contains(proto)) return false;
try {
URI uri = new URI(str);
if (protocolsWithHost.contains(proto)) {
if (uri.getHost() == null) return false;
String path = uri.getPath();
if (path != null) {
for (int i=path.length()-1; i >= 0; i--) {
if ("?<>:*|\"".indexOf( path.charAt(i) ) > -1)
return false;
}
}
}
return true;
} catch ( Exception ex ) {}
return false;
}
0 votes
Comment définir la validité si vous n'établissez pas de connexion ?
2 votes
Pouvez-vous donner un exemple de quelque chose qui n'est pas une URL valide et que la
URL
Le constructeur accepte ?1 votes
@mmyers : La validité devrait être déterminée par les RFC 2396 et 2732, celles qui définissent ce qu'est une URL.
0 votes
Que voulez-vous dire par tout ce qui commence par http:// ? Est-ce que
http://spaces allowed
valide ? Par exemplehttp://mylocalmachine
est toujours valable.4 votes
@uckelman : A peu près tout. "
http://***
" travaille. "http://my favorite site!
" fonctionne. Je n'arrive pas à faire en sorte qu'il lève une exception (lorsque http:// est au début.)0 votes
Une exception est alors levée :
http://example.com:80#foo/bar
même si l'URL est parfaitement valide.2 votes
Duplicata possible de Validation de l'URL en Java