2010-06-24 11 views

risposta

18

Capisco che potrebbe essere forzato utilizzare una regex. Tuttavia, se possibile, è meglio evitare l'uso di espressioni regolari per questa attività e utilizzare invece una classe di libreria Java per eseguire la convalida.

Se si desidera effettuare la convalida e la ricerca DNS insieme, quindi InetAddress.getByName(String) è una buona scelta. Ciò risolverà DNS, IPv4 e IPv6 in un colpo solo e restituirà un'istanza InetAddress impacchettata in modo ordinato che contiene sia il nome DNS (se fornito) sia l'indirizzo IPv4 o IPv6.

Se si desidera eseguire solo una convalida sintattica, Apache commons ha un paio di classi che dovrebbero svolgere il lavoro: DomainValidator e InetAddressValidator.

+0

Grazie, quelle classi di Apache dovrebbero fare il trucco! – ljbade

+0

Purtroppo genera un'eccezione semplicemente perché un host non esiste, non solo quando l'host non è valido. – Trejkaz

+0

@Trejkaz - di cosa "stai parlando"? Hai provato anche l'approccio alternativo? –

5

Guava ha una nuova classe HostSpecifier. Valuterà anche che il nome host (se si tratta di un nome host) termina con un "suffisso pubblico" valido (ad es. ".com", ".co.uk", ecc.), Basato sull'ultimo suffisso pubblico di mozilla elenco. È qualcosa che NON vorresti provare con una regex fatta a mano!

+0

Non vorrei fidarmi del codice che ha scattato un'istantanea dell'ultimo "suffisso pubblico", perché un paio di mesi dopo non sarà l'ultimo. – Trejkaz

0

Ispirato al codice che ho trovato in this post, ho creato il seguente metodo di convalida che sembra soddisfare le esigenze di convalida semplici abbastanza bene. Leggendo il JavaDoc dell'URI ho rimosso alcuni falsi positivi come "host: 80" e "hostname/page", ma non posso garantire che rimangano alcuni falsi positivi.

public static boolean isValidHostNameSyntax(String candidateHost) { 
    if (candidateHost.contains("/")) { 
     return false; 
    } 
    try { 
     // WORKAROUND: add any scheme and port to make the resulting URI valid 
     return new URI("my://[email protected]" + candidateHost + ":80").getHost() != null; 
    } catch (URISyntaxException e) { 
     return false; 
    } 
}