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


123

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

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에 따라 더 많은 문자

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


1
전혀 도움이되지 않을 수 있습니다. google.co.uk 및 일부 일본 도메인에 관해서는 정규식을 사용하기 전에 두 번 생각해야 할 것입니다. 내 개인적인 생각은 정규식이 실제 도메인에 대한 도메인을 검증하기에 충분하지 않다는 것입니다. 참고로, 다음은 tlds 및 국가 코드 2 차 도메인 목록의 거의 완전한 목록입니다. static.ayesh.me/misc/SO/tlds.txt
Ayesh K

1
호스트 이름 유효성 검사 에 대한 관련 질문에 대한 내 대답을 참조하십시오 .
SAM

2
종종 잊어 버림 : 정규화 된 도메인 이름의 경우 tld 뒤의 마침표를 일치시켜야합니다.
schmijos 2013

1
4 년이 지났지 만 지금은 최대 89,000 명입니다
mydoglixu

1
이 답변 중 일부는 꽤 좋지만 살펴 볼만한 다른 질문에 대한 또 다른 좋은 답변이 있습니다.
craftworkgames

답변:


49

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

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

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


이것이 작동하는 것 같습니다. 어떤 종류의 도메인이 유효성 검사를 통과하지 못합니까?
Dominic

12
@infensus-이 정규식은 사양에 따라 정확하지만 사양이 잘못되었습니다. g.co은 (는) 유효한 도메인 이름이지만 g하나의 문자입니다.
sch

3
이것은 내가 생각하는 모든 경우와 일치해야합니다. ^ ([a-z0-9]) (([a-z0-9-] {1,61})? [a-z0-9] {1})? (\. [a-z0-9] (([a-z0-9-] {1,61})? [a-z0-9] {1})?)? (\. [a-zA-Z] {2 , 4}) + $
transilvlad 2013 년

1
x.com 여기 전달 것
닐 맥기

4
@ 닐 : 당신이 맞아요. 원래 질문은 3-63 자 (편집 3 참조)를 요청했습니다. 한 문자 도메인을 매우 쉽게 지원하도록 변경할 수 있습니다 /^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/.. 그러나 이것은 여전히 ... 유효한 물건의 톤을 거부
카메론

85

나는 이것이 약간 오래된 게시물이라는 것을 알고 있지만 여기의 모든 정규식에는 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,})$

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


1
이는 최대 하나의 하위 도메인 만 지원하며 그 이상은 false가됩니다. 내부 사이트 등에서 사용하지 않는 한 비방을 /^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{1,30})\.?[a-z]{2,})$/i
당하는 것은 아닙니다

1
그러나 외로운 tld는 작동하지 않습니다 :( 예를 들어 to.( to. )는 콘텐츠가있는 유효한 URL입니다.
iiic

@iiic, 예,하지만 to.정규화 된 도메인 이름이 아닙니다. 최상위 도메인을 허용하려면과 같은 것을 사용해야 ^(((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.)?(x--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})\.?$하지만 경고 를 받으면 test또는 같은 도메인에 넣는 사람들도 통과하게됩니다 na!
Tim Groeneveld

invali.d유효 invali.d.co.uk하지 않은 동안 유효한 도메인 이름으로 허용 됩니다 .
Pawel Krakowiak

1
주목해야한다 xn--stackoverflow.com퓨니 코드 (Punycode)에서 변환 할 수 없습니다 '유래'와 같은 유효한 이름이 아닙니다. 그러나 그것은 정규식이 할 수있는 것 이상입니다. 일반적으로 xn--[a-z0-9]+레이블은 IDN 전용이지만 xn--[a-z0-9]+\-[a-z0-9]+ASCII 및 비 ASCII 문자의 혼합을 나타냅니다
Marcus

50

내 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

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


9
꽤 괜찮아 보이지만 {2,6}새 TLD에 대한 기준을 업데이트해야합니다. 아마 {2,}.
jwatts1980

@ jwatts1980 그러한 영역의 예가 있습니까? 아니면 가능한 미래 영역을 의미합니까?
paka

1
다음은 관련 리소스에 대한 예제 및 링크와 함께 예정된 변경 사항을 논의하는 기사입니다. zdnet.com/…
jwatts1980

1
왜 ([a-zA-Z] {1} [a-zA-Z] {1})이고 ([a-zA-Z] {2})가 아닌가요?
Anton

3
두 가지 대안이있는 마지막 부분도 잘못되었습니다. IDNA 하위 레이블을 허용하는 ccTLD (두 글자)가 있습니다. 이미 IDNA 레이블을 사용하는 TLD 레이블도 있습니다. 다른 레이블과 다르지 않은 마지막 레이블을 특수한 경우가 없어야합니다 (이제 하위 도메인의 다른 모든 레이블과 마찬가지로 가변 길이가 추가 된 많은 확장자가 있습니다. jsut). - "라벨의 세그먼트, 유일한 경우"- "라벨 허용됩니다 .. 마지막으로 밑줄은 모든 레이블에 사방이 유효하지 않습니다.
verdy_p

24

내 베팅 :

^(?:[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


@GaneshBabu 정확한 일치 란 무엇을 의미합니까?
Yaroslav Stavnichiy

1
다른 모든 답변은 저에게 효과가 없었지만 이것은 효과가있었습니다.
Danny Coulombe

끝에 세미콜론과 쉼표를 피하고 싶은 비슷한 요구 사항이 있었지만 아래에서 성공하지 못했습니다 const regexDomain = / ^ (? : [A-Za-z0-9] (?: [A-Za-z0-9-] {0,61} [A-Za-z0-9])? \.) + [A-Za-z0-9] [A-Za-z0-9-] { 0,61} [A-Za-z0-9] / g; 글쎄, 내가 사용하면 유효성을 검사하고; 사이에 있지만 마지막에 실패합니다.
해리

유효해야하지만 정규식에서는 유효하지 않은 여러 도메인을 찾았습니다. 예를 들어 редбулл.москва는 유효한 도메인이거나 редбулл.рф 및 红色 的 公牛. 中国
pubkey

1
@pubkey, 해당 도메인 이름을 punycode 로 변환해야합니다 . редбулл.москва의 실제 이름은 xn--90afc0aazy.xn--80adxhks이며 내 정규식이 일치합니다.
Yaroslav Stavnichiy

13

사소한 수정일뿐입니다. 마지막 부분은 최대 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


3
참고 : 이것은 유효한 (아직 드문) 도메인 이름 www.my---domain.com을 전달하지 않습니다.
Chris Bier

17
새로운 TLD의 예와 그것을 잘라하지 않습니다.photography
샘 피구에 로아에게

2
@SamFigueroa 당신은 그것의 길이를 수정해야합니다
스틸 뇌

3
하위 도메인과 다르지 않은 TLD에 대한 검사가 없어야합니다. 그리고 현재 availabletlds에 정규식을 기반으로하는 것은 미래의 증거가 아닙니다.
Loïc Faure-Lacroix

1
마지막 비트가 될 제안 {2,63}은 다음을 참조 stackoverflow.com/questions/9238640/...
에릭 돕 스는

13

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

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

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


4
새로운 이상 TLD의 .audio 같은 이름, .photography, 이들의 대부분 ... 지원 data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000

@ mrbinky3000 마지막 {2,6}을 다른 것으로 변경하면 작동합니다. 내 :^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod

@Mygod 귀하의 정규식에는 마지막 물음표를 지나서 너비가 0 인 쓰레기가 포함되어 있으므로 복사하는 사람은 누구나 불쾌하게 놀라게 될 것입니다.
MightyPork

1
@MightyPork 당신이 맞아요! (희망적으로) 깨끗한 버전이 있습니다.^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod

아주 좋아. 아아, lookbehind 표현식은 JavaScript에서 유효하지 않습니다. : /
PhiLho

13

이 답변은 이메일 호스트 이름과 같은 호스트 이름이 아닌 도메인 이름 (서비스 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,}

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


1
감사! 이것은 여기서 최고의 정규식입니다. 철저한 설명과 단위 테스트는 보너스입니다.
naudster

"RR"은 무엇을 의미합니까?
wheeler

자원 기록. 일반적으로 서비스와 상호 작용하는 방법을 알려주는 텍스트 또는 정보 필드입니다.
앤드류 Domaszek

이 정규식은 올바르지 않습니다. 예를 들어 도메인 redbull. 移动는 유효하지만 정규식은 일치하지 않습니다.
pubkey

먼저 퓨니 코드로 변환 한 다음 일치합니다. 퓨니 코드 이전 버전의 길이 제한은 구현하기가 정말 어렵습니다.
Andrew Domaszek

8

다른 답변에서 도메인 이름 유효성 검사 솔루션의 올바른 방향을 알려 주셔서 감사합니다. 도메인 이름은 다양한 방법으로 검증 될 수 있습니다.

사람이 읽을 수있는 형식으로 IDN 도메인의 유효성을 검사해야하는 경우 regex 가 도움이됩니다. 이를 통해 모든 언어의 모든 문자를 일치시킬 수 있습니다.\p{L}

참고 하이픈을 포함 할 수 있습니다 마지막 부분 도를! punycode로 인코딩 된 Chineese 이름에는 tld에 유니 코드 문자가있을 수 있습니다.

예를 들어 일치하는 솔루션을 찾았습니다.

  • google.com
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国 互联 网络 信息 中心. 中国
  • xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

정규식은 다음과 같습니다.

^[0-9\p{L}][0-9\p{L}-\.]{1,61}[0-9\p{L}]\.[0-9\p{L}][\p{L}-]*[0-9\p{L}]+$

여기에서 확인하고 조정하세요.

참고 :이 정규식은 현재 도메인 이름에서 문자 집합을 허용하므로 매우 관대합니다.

업데이트 : 더욱 단순화, 같은 a-aA-Z\p{L}단지와 동일\p{L}

비고 2 : 유일한 문제는 그것이 더블 도트 도메인을 일치한다는 것입니다 ... 같은 masełk..owski.pl. 이 문제를 해결하는 방법을 아는 사람이 있으면 개선하십시오.


대신 [:alpha:][:digit]을 사용할 수 있습니다 \p{L}. 잘 작동합니다.
puchu

먼저 punycode로 변환하지 않고는 이러한 방식으로 IDN의 유효성을 검사 할 수 없습니다. 예를 들어 expr을 사용하면 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国유효한 것으로 확인되지만 IDN 변환 후에는 레이블 당 바이트가 너무 많습니다. \ p {L}은 punycode 바이트 (기호마다 다릅니다)가 아니라 기호와 일치하므로 변환 후 크기를 제한하려고 할 때 반복 횟수가 도움이되지 않습니다.
Andrew Domaszek

좋은 점은 각 부분이 64 바이트로 제한된다는 것입니다. 그러나 RegExp로 확인할 수 없으므로 punycode 디코더를 사용하여 추가 유효성 검사 단계가 필요합니다. 이는 예제 호스트 이름으로 실패합니다. 중국인들은이 한계 때문에 화가 났을 것입니다.
PeterM

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

[도메인-소문자 및 0-9 만 가능] [하이픈 사용 가능] + [TLD-소문자 만, 2 ~ 7 자 사이 여야 함]
http://rubular.com/ 은 정규 표현식 테스트에 훌륭합니다!
편집 : Dan Caddigan이 지적한대로 '.rentals'의 TLD 최대 값을 7 자로 업데이트했습니다.


1
TLD를 제한하는 이유는 무엇입니까? 이제는 .photography유효하지 않습니다. 무제한 문자 또는 이와 비슷한 것으로 만드십시오.
adriaan

5

아직 댓글을 작성할 담당자가 충분하지 않습니다. paka의 솔루션에 따라 세 가지 항목을 조정해야한다는 것을 알았습니다.

  • 대시가 범위로 ​​해석되어 대시와 밑줄이 이동되었습니다 (예 : "0-9").
  • 하위 도메인이 많은 도메인 이름에 대한 마침표 추가
  • TLD의 잠재적 길이를 13으로 확장

전에:

^(([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})$

후:

^(([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,13}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

3

새로운 gTLD의 경우

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu

2
당신이 대답 한 것이 다른 것보다 더 나은 점을 좀 더 자세히 알려주세요. 더 일치하는 것은 무엇입니까? 정보를 추가하려면 게시물을 직접 편집하십시오.
스벤 R.

내가 쓴 것처럼 : 새로운 gTLD. 유니 코드 문자와 유니 코드 TLD가있는 도메인.
벤 카일

1
@BenKeil :이 부분은 무엇입니까 : (? <!-)
jor

@jor는 부정적인 모습입니다. 이 아웃 확인 shortcutfoo.com/app/dojos/regex/cheatsheet
무하마드 Faizan

3

이미 지적했듯이 실제적인 의미에서 하위 도메인 (예 : .co.uk도메인) 을 말하는 것은 분명하지 않습니다 . 이 정규식을 사용 하여 야생에서 발생하는 도메인을 확인합니다. 내가 아는 모든 실제 사용 사례를 다룹니다. 새로운 사람들을 환영합니다. 가이드 라인 에 따르면 캡처하지 않는 그룹과 탐욕스러운 매칭을 방지합니다.

^(?!.*?_.*?)(?!(?:[\d\w]+?\.)?\-[\w\d\.\-]*?)(?![\w\d]+?\-\.(?:[\d\w\.\-]+?))(?=[\w\d])(?=[\w\d\.\-]*?\.+[\w\d\.\-]*?)(?![\w\d\.\-]{254})(?!(?:\.?[\w\d\-\.]*?[\w\d\-]{64,}\.)+?)[\w\d\.\-]+?(?<![\w\d\-\.]*?\.[\d]+?)(?<=[\w\d\-]{2,})(?<![\w\d\-]{25})$

증명, 설명 및 예 : https://regex101.com/r/FLA9Bv/9 ( 참고 : 정규식이 ECMA2018에서만 지원되는 lookbehind를 사용하기 때문에 현재 Chrome에서만 작동합니다. )

도메인을 확인할 때 선택할 수있는 두 가지 방법이 있습니다.

책별 FQDN 일치 (이론적 정의, 실제로 거의 발생하지 않음) :

실용적 / 보수적 FQDN 일치 (실제적 정의, 실제로 예상되고 지원됨) :

  • 다음 예외 / 추가 사항과 일치하는 도서 별
  • 유효한 문자 : [a-zA-Z0-9.-]
  • 레이블은 하이픈으로 시작하거나 끝날 수 없습니다 ( RFC-952RFC-1123 / 2.1에 따라 ).
  • TLD 최소 길이는 2 자, 최대 길이는 현재 기존 레코드에 따라 24 자입니다.
  • 후행 점과 일치하지 않음


2

다음은 예제와 함께 완전한 코드입니다.

<?php
function is_domain($url)
{
    $parse = parse_url($url);
    if (isset($parse['host'])) {
        $domain = $parse['host'];
    } else {
        $domain = $url;
    }

    return preg_match('/^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/', $domain);
}

echo is_domain('example.com'); //true
echo is_domain('https://example.com'); //true
echo is_domain('https://.example.com'); //false
echo is_domain('https://localhost'); //false

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

내 대답의 근거에 대해 @mkyong에게 감사드립니다. 더 오래 허용되는 레이블을 지원하도록 수정했습니다.

또한 "localhost"는 기술적으로 유효한 도메인 이름입니다. 국제화 된 도메인 이름을 수용하기 위해이 답변을 수정하겠습니다.


0
/^((([a-zA-Z]{1,2})|([0-9]{1,2})|([a-zA-Z0-9]{1,2})|([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]))\.)+[a-zA-Z]{2,6}$/
  • ([a-zA-Z]{1,2}) -> 두 문자 만 허용합니다.

  • ([0-9]{1,2})-> 두 개의 숫자 만 허용

2를 초과하는 것이 있으면 ([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])이 정규식이 처리합니다.

매칭을 원할 경우 적어도 한 번 +사용됩니다.


0

^ [a-zA-Z0-9] [-a-zA-Z0-9] + [a-zA-Z0-9]. [az] {2,3} (. [az] {2,3}) ? (. [az] {2,3})? $

작동하는 예 :

stack.com
sta-ck.com
sta---ck.com
9sta--ck.com
sta--ck9.com
stack99.com
99stack.com
sta99ck.com

확장 기능에서도 작동합니다.

.com.uk
.co.in
.uk.edu.in

작동하지 않는 예 :

-stack.com

가장 긴 도메인 확장자로도 작동합니다. ".versicherung"



0

다음 정규식은 주어진 도메인의 하위, 루트 및 tld를 추출합니다.

^(?<domain>(?<domain_sub>(?:[^\/\"\]:\.\s\|\-][^\/\"\]:\.\s\|]*?\.)*?)(?<domain_root>[^\/\"\]:\s\.\|\n]+\.(?<domain_tld>(?:xn--)?[\w-]{2,7}(?:\.[a-zA-Z-]{2,3})*)))$

다음 도메인에 대해 테스트되었습니다.

* stack.com
* sta-ck.com
* sta---ck.com
* 9sta--ck.com
* sta--ck9.com
* stack99.com
* 99stack.com
* sta99ck.com
* google.com.uk
* google.co.in

* google.com
* masełkowski.pl
* maselkowski.pl
* m.maselkowski.pl
* www.masełkowski.pl.com
* xn--masekowski-d0b.pl
* xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

* xn--stackoverflow.com
* stackoverflow.xn--com
* stackoverflow.co.uk

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.