[regex] 하위 도메인없이 유효한 도메인 이름과 일치하는 정규 표현식은 무엇입니까?

도메인 이름을 확인해야합니다.

google.com

stackoverflow.com

따라서 가장 원시적 인 형태의 도메인은 www와 같은 하위 도메인도 아닙니다.

  1. 문자는 az | AZ | 0-9마침표 (.) 및 대시 (-)
  2. 도메인 이름 부분은 대시 (-)로 시작하거나 끝나서는 안됩니다 (예 : -google-.com).
  3. 도메인 이름 부분은 1 ~ 63 자 사이 여야합니다.
  4. 확장 (TLD)은 현재 # 1 규칙에 따라 무엇이든 될 수 있습니다. 나중에 목록과 비교하여 유효성을 검사 할 수 있지만 1 자 이상이어야합니다.

편집 : TLD는 분명히 2-6 자입니다.

아니. 4 개정 됨 : TLD는 .co.uk와 같은 것을 포함해야하므로 실제로 “하위 도메인”이라는 레이블이 지정되어야합니다. 가능한 유일한 유효성 검사 (목록에 대한 검사는 제외)는 ‘첫 번째 점 뒤에 하나 또는 규칙 # 1에 따라 더 많은 문자

정말 고마워요, 제가 시도했다고 믿으세요!



답변

음, 특정 요구 사항을 고려할 때 보이는 것보다 약간 더 간단 합니다 (댓글 참조).

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

그러나 이것은 많은 유효한 도메인을 거부합니다.


답변

나는 이것이 약간 오래된 게시물이라는 것을 알고 있지만 여기의 모든 정규식에는 IDN 도메인 이름 지원이라는 매우 중요한 구성 요소가 누락되었습니다.

IDN 도메인 이름 은 xn--로 시작합니다. 도메인 이름에 확장 된 UTF-8 문자를 사용할 수 있습니다. 예를 들어 “♡ .com”이 유효한 도메인 이름이라는 것을 알고 계셨습니까? 네, “러브 하트 닷컴”! 도메인 이름을 확인하려면 http://xn--c6h.com/ 이 확인을 통과 하도록해야합니다 .

이 정규식을 사용하려면 도메인을 소문자로 변환하고 IDN 라이브러리를 사용하여 도메인 이름을 ACE로 인코딩해야합니다 ( “ASCII 호환 인코딩”이라고도 함). 좋은 라이브러리 중 하나는 GNU-Libidn입니다.

idn (1)은 국제화 된 도메인 이름 라이브러리에 대한 명령 줄 인터페이스입니다. 다음 예제는 UTF-8의 호스트 이름을 ACE 인코딩으로 변환합니다. 결과 URL https : //nic.xn--flw351e/https : // nic. 谷 歌 /에 해당하는 ACE 인코딩 된 URL 로 사용할 수 있습니다 .

  $ idn --quiet -a nic.谷歌
  nic.xn--flw351e

이 마법의 정규 표현식은 대부분의 도메인을 포함 해야 합니다 (하지만 내가 놓친 유효한 엣지 케이스가 많이 있다고 확신합니다).

^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$

도메인 유효성 검사 정규식을 선택할 때 도메인이 다음과 일치하는지 확인해야합니다.

  1. xn--stackoverflow.com
  2. stackoverflow.xn--com
  3. stackoverflow.co.uk

이 세 도메인이 통과하지 못하면 정규 표현식이 합법적 인 도메인을 허용하지 않을 수 있습니다!

체크 아웃 오라클의 국제 언어 환경 설명서에서 다국어 도메인 이름 지원 페이지 자세한 내용은.

여기에서 정규식을 사용해보십시오 : http://www.regexr.com/3abjr

ICANN 은 IDN 도메인의 몇 가지 예를 보는 데 사용할 수있는 위임tld 목록을 유지 합니다.


편집하다:

 ^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$

이 정규식은 호스트 이름 끝에 ‘-‘가있는 도메인이 유효한 것으로 표시되는 것을 중지합니다. 또한 무제한 하위 도메인을 허용합니다.


답변

내 RegEx는 다음입니다.

^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$

i.oh1.mewow.british-library.uk 는 괜찮 습니다.

UPD

다음은 업데이트 된 규칙입니다.

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

정규식 시각화

https://www.debuggex.com/r/y4Xe_hDVO11bv1DV

지금은 확인 -하거나 _시작 또는 도메인 라벨의 끝.


답변

내 베팅 :

^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$

설명 :

도메인 이름은 세그먼트에서 작성됩니다. 다음은 하나의 세그먼트입니다 (최종 제외).

[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?

1-63 자일 수 있으며 ‘-‘로 시작하거나 끝나지 않습니다.

이제 ‘.’를 추가하십시오. 그것에 적어도 한 번 반복하십시오 :

(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+

그런 다음 2 ~ 63 자 길이의 최종 세그먼트를 첨부합니다.

[a-z0-9][a-z0-9-]{0,61}[a-z0-9]

여기에서 테스트하십시오 : http://regexr.com/3au3g


답변

사소한 수정일뿐입니다. 마지막 부분은 최대 6 개 여야합니다. 따라서

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$

가장 긴 TLD는 museum(6 자)-http: //en.wikipedia.org/wiki/List_of_Internet_top-level_domains


답변

나를 위해 작동하지 않는 수락 된 답변은 다음을 시도하십시오.

^ ((?!-) [A-Za-z0-9-] {1,63} (? <!-) \.) + [A-Za-z] {2,6} $

검증을 위해이 단위 테스트 사례 를 방문하십시오 .


답변

이 답변은 이메일 호스트 이름과 같은 호스트 이름이 아닌 도메인 이름 (서비스 RR 포함)에 대한 것입니다.

^(?=.{1,253}\.?$)(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}$

기본적으로 mkyong의 대답 이며 추가로 다음과 같습니다.

  • 길이 접두사 및 널 루트를 포함하여 최대 255 옥텟 길이.
  • 후행 ‘.’허용 명시 적 DNS 루트의 경우.
  • 서비스 도메인 RR에 선행 ‘_’허용 (버그 : _ 레이블에 대해 최대 15자를 적용하지 않으며 서비스 RR보다 하나 이상의 도메인이 필요하지 않음)
  • 가능한 모든 TLD와 일치합니다.
  • 하위 도메인 레이블을 캡처하지 않습니다.

부품 별

미리보기, 선택적 후행 리터럴 ‘.’을 사용하여 최대 길이를 ^ $에서 253 자로 제한합니다.

(?=.{1,253}\.?$)

미리보기, 다음 문자는 ‘-‘가 아니며 다음 ‘.’앞의 문자 뒤에 ‘_’가 없습니다. 즉, 레이블의 첫 번째 문자가 ‘-‘가 아니고 첫 번째 문자 만 ‘_’가되도록 강제합니다.

(?!-|[^.]+_)

라벨 당 허용되는 문자 중 1 ~ 63 자

[A-Za-z0-9-_]{1,63}

Lookbehind, 이전 문자는 ‘-‘가 아닙니다. 즉, 레이블의 마지막 문자가 ‘-‘가 아니도록 강제합니다.

(?<!-)

강제로 ‘.’ 마지막 레이블을 제외한 모든 레이블의 끝에는 선택 사항입니다.

(?:\.|$)

대부분 위와 결합하면 적어도 두 개의 도메인 수준이 필요하며 이는 정확하지는 않지만 일반적으로 합리적인 가정입니다. TLD 또는 정규화되지 않은 상대 하위 도메인 (예 : localhost, myrouter, to)을 허용하려면 {2,}에서 +로 변경합니다.

(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}

이 식에 대한 단위 테스트 입니다.