11

私は Python を使用しており、単純な API または正規表現を使用してドメイン名の有効性を確認したいと考えています。有効性によって、私は構文上の有効性であり、ドメイン名が実際にインターネット上に存在するかどうかではありません。

4

5 に答える 5

16

ドメイン名は、ドットで区切られた識別子のリストであり、それぞれが63文字以内で、文字、数字、ダッシュ(アンダースコアなし)で構成されている場合、(構文的に)有効です。

それで:

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

スタートになります。もちろん、最近では、Ascii以外の文字が許可される場合があります(ごく最近の開発)。これにより、パラメーターが大幅に変更されます。これに対処する必要がありますか?

于 2010-05-24T05:27:31.223 に答える
6
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)、最大で255文字であることを確認します
  • 1から63までの長さで、英数字で開始および終了し、中央に英数字の文字とハイフンを含む1つ以上のラベル(ピリオドで区切られている)。
  • トップレベルドメイン名が続きます(博物館の場合、最大長は5です)。
于 2010-05-24T05:31:44.803 に答える
3

正規表現で何かを行うこともできますが、有効なドメイン名をテストする最も信頼できる方法は、実際に名前を解決しようとすることです ( socket.getaddrinfoを使用):

from socket import getaddrinfo

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

技術的には、これにより DoS に対して無防備になる可能性があることに注意してください (誰かが何千もの無効なドメイン名を送信した場合、無効な名前を解決するのに時間がかかることがあります) が、これを試みる人を単純にレート制限することができます.

これの利点は、正規表現が「hotmail.con」が有効であると言うのに対し、「hotmail.com」の代わりに「hotmail.con」を無効としてキャッチすることです。

于 2010-05-24T05:39:49.610 に答える