2010-06-24 3 views

답변

18

은 정규식을 사용하는 것으로 알고 있습니다. 그러나 가능한 경우이 작업에 regexes를 사용하지 않는 것이 좋으며 대신 Java 라이브러리 클래스를 사용하여 유효성 검사를 수행하는 것이 좋습니다.

유효성 검사와 DNS 조회를 함께 수행하려면 InetAddress.getByName(String)이 좋습니다. 이렇게하면 DNS, IPv4 및 IPv6을 한 번에 처리 할 수 ​​있으며 DNS 이름 (제공된 경우)과 IPv4 또는 IPv6 주소가 모두 포함 된 깔끔하게 포장 된 InetAddress 인스턴스를 반환합니다.

구문 검증을 원할 경우 Apache commons에는 작업을 수행해야하는 클래스가 두 개 있습니다 (DomainValidatorInetAddressValidator).

+0

고맙게도, 그 아파치 클래스 트릭을해야합니다! – ljbade

+0

슬프게도 호스트가 유효하지 않을 때뿐만 아니라 호스트가 존재하지 않기 때문에 예외가 발생합니다. – Trejkaz

+0

@Trejkaz - 너 무슨 소리 야? 대체 접근법을 시도 했습니까? –

5

구아바에는 새로운 클래스 HostSpecifier이 있습니다. 또한 호스트 이름 (호스트 이름 인 경우)이 유효한 "공용 접미어"(예 : ".com", ".co.uk"등)로 끝나는 지 확인합니다. 최신 Mozilla 공용 접미어를 기반으로합니다 명부. 그건 당신이 손으로 만들어진 정규식으로 시도하고 싶지 않을 것입니다!

+0

"최신"공용 접미사 목록의 스냅 샷을 찍은 코드를 신뢰하지 않으려는 것입니다. 몇 개월 후 최신 공개 서 픽스가되지 않기 때문입니다. – Trejkaz

0

this post에서 찾은 코드에서 영감을 얻어 간단한 유효성 검사에 적합한 다음 유효성 검사기 메서드를 만들었습니다. URI의 JavaDoc을 읽음으로써 "host : 80"및 "hostname/page"와 같은 오탐 (false positive)을 제거했지만 일부 오탐 (false positive)이 있음을 보장 할 수는 없습니다.

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; 
    } 
} 
관련 문제