2010-05-24 3 views
9

저는 파이썬을 사용하고 있으며 간단한 api 또는 regex로 하여금 도메인 이름의 유효성을 검사하기를 원합니다. 타당성에 의해 필자는 문법적 유효성과 도메인 이름이 실제로 인터넷에 존재하는지 아닌지에 대한 것이 아닙니다.문자열에서 유효한 도메인 이름을 확인 하시겠습니까?

+0

어떤 이유로? 전자 메일이라고 가정하면 정규 표현식이 아니라 MX 레코드에 대한 DNS 쿼리를 수행하여 실제 유효성을 검사해야합니다. – Kimvais

+5

Nope. 알려진 유효하지 않은 이름을 조회 할 때 별다른 이점이 없으며 단지 시간과 자원을 낭비합니다. 또한 전자 메일을 전달하기 위해 MX 레코드가 필요하지 않은 경우 A 레코드로 충분합니다. – Synchro

+0

은 이미 설명한 것 같다 [여기 (http://stackoverflow.com/questions/1128168/validation-for-url-domain-using-regex-rails). – Incognito

답변

13

모든 도메인 이름은 식별자의 점으로 구분 된 목록의 각 더 이상 63 자 이하 경우 (구문) 유효하고, 문자, 숫자 및 대시 (아무 밑줄)의 구성.

그래서 :

r'[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*' 

는 시작이 될 것입니다. 물론 요즘에는 Ascii가 아닌 일부 문자가 허용 될 수 있습니다 (최근 개발). 매개 변수를 많이 변경합니다.이를 처리해야합니까?

+0

하이픈으로 시작/끝 식별자를 사용할 수 있습니까? – Amarghosh

+0

감사! 아니요, '블랙리스트에 포함 된 문자가 포함되지 않도록 기본적인 정신 건강 체크가 필요하지 않습니다. "등 – demos

+0

알렉스, 나는 당신이에서 appengine의 전문가 알고,이 날 도와주세요 : 에 http : // 유래.co.kr/questions/2894808/creating-auto-incrementing-column-in-google-appengine 미리 감사드립니다. – demos

5
r'^(?=.{4,255}$)([a-zA-Z0-9][a-zA-Z0-9-]{,61}[a-zA-Z0-9]\.)+[a-zA-Z0-9]{2,5}$' 
  • 내다는 시작과 끝은 최소 4 (a.in) 1 ~ 63 사이의 길이 (기간으로 구분) 255 자
  • 하나 이상의 라벨 최대가 있는지 확인한다 영숫자로되어 있으며 중간에 영숫자 문자와 하이픈을 포함합니다. (누구의 최대 길이가 5 박물관 용) 최상위 도메인 이름은 정규식 뭔가, 유효한 도메인 이름을 테스트 할 가장 신뢰할 수 방법을 할 수있는 동안 그
+1

이것은 punycode를 저장할 수 없습니다. 가장 짧은 키릴 스크립트 2 글자 최상위 도메인은 punycode에서 6 글자입니다. – kaleissin

+2

박물관은 6 문자가 아니라 5 문자입니다. –

+0

예상되는 TLD 길이를 하드 코딩하는 것은 좋지 않습니다. 특히 IDN TLD가 인코딩되어 5보다 훨씬 길어지기 때문에 어렵습니다. –

1

참고로 이어

  • 실제로 (socket.getaddrinfo로) 이름을 확인하는 것입니다 : 기술적으로이 사람이 잘못된 도메인 이름의 수천을 제출하는 경우 (DOS로 당신에게 개방을 남길 수 있습니다

    from socket import getaddrinfo 
    
    result = getaddrinfo("www.google.com", None) 
    print result[0][4] 
    

    주, 그것은 잘못된 남를 해결하기 위해 시간이 걸릴 수 있습니다 es) 그러나 이것을 시도하는 누군가를 평가할 수 있습니다.

    이것의 장점은 정규 표현식이 유효 "hotmail.con"를 말할 것입니다 반면이 (대신 "hotmail.com"의 말을) 무효로 "hotmail.con"을 잡을 것이라는 점이다.

  • +2

    이것은 실제로 별개의 문제이며 질문에 대한 좋은 답변이 아닙니다. 과거에 DNS가 악용에 사용되었다는 것을 감안할 때, 문자열을 사용하기 전에 적어도 막연하게 유효한지 확인하는 것은 현명한 방법 일뿐 아니라 DNS 조회보다 훨씬 빠른 속도입니다. 이것은 코드를 실행하여 악의적인지 확인하는 것과 유사합니다! – Synchro

    +0

    이미 생성 된 도메인 이름의 유효성을 검사하는 데는 사용할 수 없습니다. 기존 도메인 이름에 대해서만 유효합니다. – nerdoc

    +0

    'https : // google.com /'과 같은 유효한 URL이 오류를 반환하는 이유는 무엇입니까? –

    0

    것은 나는이 사용했던 :

    (r'(\.|\/)(([A-Za-z\d]+|[A-Za-z\d][-])+[A-Za-z\d]+){1,63}\.([A-Za-z]{2,3}\.[A-Za-z]{2}|[A-Za-z]{2,6})') 
    

    은 다음과 보장하기 위해 두 점 후 (WWW.) 또는/(HTTP : //) 및 대시 이름 만 내부와 같은 접미사와 일치하는 발생 gov.uk도.

    0

    대답은 모두이 시점에서 스펙 꽤 오래된 있습니다. 아래의 내용이 현재 사양과 정확하게 일치 할 것입니다.

    r'^(?=.{1,253}$)(?!.*\.\..*)(?!\..*)([a-zA-Z0-9-]{,63}\.){,127}[a-zA-Z0-9-]{1,63}$' 
    
    관련 문제