유효한 도메인 이름에 대해이 Regex 점검을 개선 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/399932

  •  29-08-2019
  •  | 
  •  

문제

그래서 저는이 도메인 이름 정규 표현식을 작업했습니다. 지금까지 SLDS 및 TLD (선택적 CCTLD 포함)로 도메인 이름을 선택하는 것으로 보이지만 TLD 목록의 복제가 있습니다. 더 이상 리팩게 할 수 있습니까?

params[:domain_name].downcase.strip.match(/^[a-z0-9\-]{2,63}
\.((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|
(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|
(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|
(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|
(m[acdghklmnopqrstuvwxyz]|me|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|
(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|
(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])
(\.((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|
(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|
(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|
(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|
m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|
(n[acefgilopruz]|name|net)|(om|org)|
(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|
(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]))?$/)
도움이 되었습니까?

해결책

제발 제발 제발 ~하지 않다 알려진 도메인 이름과 일치하도록 이와 같은 고정되고 끔찍한 복잡한 정규식을 사용하십시오.

TLD의 목록은입니다 ~ 아니다 정적, 특히 ICANN은 새로운 GTLD에 대한 간소화 된 프로세스를보고 있습니다. cctlds 목록조차도 때때로 변경됩니다!

사용 가능한 목록을 살펴보십시오 http://publicsuffix.org/ 대신 해당 목록을 다운로드하고 구문 분석 할 수있는 코드를 작성하십시오.

다른 팁

다운로드 : http://data.iana.org/tld/tlds-alpha-by-domain.txt

예제 사용 (파이썬) :

import re
def validate(domain):
    valid_domains = [ line.upper().replace('.', '\.').strip() 
                      for line in open('domains.txt') 
                      if line[0] != '#' ]
    r = re.compile(r'^[A-Z0-9\-]{2,63}\.(%s)$' % ('|'.join(valid_domains),))
    return True if r.match(domain.upper()) else False


print validate('stackoverflow.com')
print validate('omnom.nom')

성능을 돕기 위해 Validate 기능에서 도메인 목록 구축을 고려할 수 있습니다.

나는 아마도 도메인 이름에 대해 충분히 모른다. 그러나 왜 "foo.info.com"과 같은 도메인이 일치합니까? 이 경우 도메인 이름이 "info.com"인 것 같습니다.

그리고 이름이 [az d]로 시작하는지 확인하고 싶을 수도 있습니다. 대시로 시작하는 도메인을 등록 할 수 있다고 생각하지 않습니까?

글을 쓰고있는 것처럼, TLD 부분은 동일하지만 (\.<tldpart>){1,2} 그러나 나는 그것이 복제를 위해 수정 될 수 있다고 확신합니다 ...

편집 : 네, 아니요, 가능할 것입니다. 그러나 본질적으로 내가 생각하는 중복을 처리하는 것은 매우 느린 무차별 인력 목록입니다. 가능한 TLD 및 SLD+국가 쌍을 큰 해시 맵에 넣고 그에 대한 하위 문자열을 확인하는 것이 더 간단하고 빠릅니다.

규칙에 따라 시작하는 것이 좋습니다 RFC 1035, 그리고 뒤로 작업하십시오. 도메인 Regex 패턴은 (이메일 주소 REGEX 패턴에 대해 2 위) 가장 일반적인 것입니다. 사이트를 확인하겠습니다 regexlib.com 다른 사람들이 한 일을 탐색하십시오.

REGEX를 문자열로 구축 한 다음 Regexp.new (String)를 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top