Какое регулярное выражение будет соответствовать действительному имени домена без поддомена?

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 исправлено: ДВУ на самом деле должен быть помечен как «субдомен», поскольку он должен включать такие вещи, как .co.uk - я бы предположил, что единственно возможная проверка (помимо проверки по списку) будет «после первой точки должна быть одна или больше символов по правилам # 1

Большое спасибо, поверьте, я попробовал!

Dominic
источник
1
Может быть вообще бесполезен. Что касается google.co.uk и некоторых японских доменов, я уверен, что вам придется дважды подумать, прежде чем использовать для этого регулярное выражение. Я лично считаю, что регулярного выражения недостаточно для подтверждения домена в реальном домене. К вашему сведению, вот почти полный список TLD и список доменов второго уровня с кодом страны: static.ayesh.me/misc/SO/tlds.txt
K
1
См. Мой ответ на связанный вопрос о проверке имени хоста .
SAM
2
Часто забывают: для полных доменных имен вы должны поставить точку после tld.
schmijos
1
прошло 4 года, сейчас счет до
89000
1
Некоторые из этих ответов довольно хороши, но есть еще один хороший ответ на этот другой вопрос , на который стоит обратить внимание.
craftworkgames

Ответы:

50

Что ж, это довольно просто, немного хитрее, чем кажется (см. Комментарии), учитывая ваши конкретные требования:

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

Но учтите, что это приведет к отклонению множества действительных доменов.

Cameron
источник
Приятно спасибо, похоже, работает. Какие домены не проходят проверку вы знаете?
Доминик
12
@infensus - хотя это регулярное выражение верно с учетом ваших спецификаций, ваши спецификации неверны. g.co- действительное доменное имя, но gсостоит только из одного символа.
sch
3
Я думаю, это должно соответствовать всем случаям: ^ ([a-z0-9]) (([a-z0-9 -] {1,61})? [A-z0-9] {1})? (\. [а-z0-9] (([а-z0-9 -]? {1,61}) [а-z0-9] {1})?.) (\ [A-Za-Z] {2 , 4}) + $
transilvlad
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 .

  $ 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 - ком
  3. stackoverflow.co.uk

Если эти три домена не проходят, возможно, ваше регулярное выражение не разрешает допустимые домены!

Посетите страницу поддержки интернационализированных доменных имен в Руководстве по международной языковой среде Oracle для получения дополнительной информации.

Не стесняйтесь опробовать регулярное выражение здесь: http://www.regexr.com/3abjr

ICANN ведет список делегированных TLD, который можно использовать для просмотра некоторых примеров доменов IDN.


Редактировать:

 ^(((?!-))(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
stakolee
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!
Тим Гроеневельд
Он принимает invali.dкак действительное доменное имя, а invali.d.co.ukнедействительно.
Павел Краковяк
1
Следует отметить, что xn--stackoverflow.comэто недопустимое имя, поскольку «stackoverflow» не может быть преобразован из Punycode. Однако это выходит за рамки того, что может делать регулярное выражение. В качестве общего замечания, xn--[a-z0-9]+метки будут только для IDN, тогда как xn--[a-z0-9]+\-[a-z0-9]+обозначать сочетание символов ASCII и не-ASCII
Маркус,
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.me и для wow.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})?
Антон
3
последняя часть с двумя альтернативами также неверна: существуют ccTLD (две буквы), которые принимают вложенные метки IDNA. Также сейчас существуют метки TLD, уже использующие метки IDNA. Не следует выделять последнюю метку, которая не отличается от других (и теперь в нее добавлено много расширений переменной длины, но, как и все другие метки в поддоменах. Обратите внимание, что метки IDNA могут также отображаться в кодировке Punycoded (в этом случае будет "- - «сегмент в метке, единственный случай, когда в метках разрешен« - ».. Наконец, подчеркивание недопустимо везде во всех метках.
verdy_p 06
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 Что вы подразумеваете под точным соответствием?
Ярослав Ставничий
1
Все остальные ответы не сработали для меня, но этот сработал.
Дэнни Куломб
У меня было аналогичное требование, когда я хочу избежать точки с запятой и запятой в конце. Я много пробовал, но безуспешно, ниже - это регулярное выражение, которое я использую 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] / г; Он проверяет, использую ли я, и; между ними, но в конце не может влиять.
Гарри
Я нашел несколько доменов, которые должны быть действительными, но недействительны с вашим регулярным выражением. Например редбулл.москва - действительный домен или также редбулл.рф и 红色 的 公牛. 中国
pubkey
1
@pubkey, вам нужно преобразовать эти доменные имена в punycode . Фактическое имя редбулл.москва - xn - 90afc0aazy.xn - 80adxhks И мое регулярное выражение соответствует ему.
Ярослав Ставничий
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

ahadinyoto
источник
3
Примечание: при этом не будет передано действительное (но редкое) доменное имя www.my---domain.com
Chris Bier
17
Не сокращает это с новым TLD, например.photography
Сэм Фигероа
2
@SamFigueroa Вам просто нужно изменить его длину
Steel Brain
3
не должно быть проверки для TLD, он не отличается от поддоменов. И основание регулярного выражения на текущих availabletld не является залогом будущего.
Лоик Фор-Лакруа,
1
Предложите последний бит {2,63}: см. Stackoverflow.com/questions/9238640/…
Эрик Доббс
13

Принятый ответ не работает для меня, попробуйте следующее:

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

Посетите эти примеры модульных тестов для проверки.

mkyong
источник
4
нет поддержки для новых более длинных имен TLD, таких как .audio, .photography, и большинства из них ... data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000
@ mrbinky3000 Просто замените последнее {2,6}на что-нибудь другое, и оно будет работать. Mine:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod
@Mygod, ваше регулярное выражение содержит мусор нулевой ширины после последнего вопросительного знака, так что любой, кто его копирует, будет неприятно удивлен
MightyPork
1
@MightyPork Ты прав! Извините, вот (надеюсь) чистая версия:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod
Очень хорошо. Увы, выражения просмотра назад недопустимы в JavaScript. : /
PhiLho
13

Этот ответ предназначен для доменных имен (включая служебные RR), а не для имен хостов (например, имени хоста электронной почты).

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

В основном это ответ Макьонга, а также:

  • Максимальная длина 255 октетов, включая префиксы длины и нулевой корень.
  • Разрешить завершение '.' для явного корня DNS.
  • Разрешить начальный '_' для RR сервисного домена (ошибки: не требует макс. 15 символов для меток _, и при этом не требуется хотя бы один домен выше сервисных RR)
  • Соответствует всем возможным TLD.
  • Не записывает ярлыки субдоменов.

По частям

Lookahead, ограничьте максимальную длину от ^ $ до 253 символов с необязательным завершающим литералом '.'

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

Посмотри вперед, следующий символ не является «-», и ни один символ «_» не следует за любыми символами перед следующим «.». Иными словами, убедитесь, что первый символ метки не является «-», и только первый символ может быть «_».

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

От 1 до 63 разрешенных символов на этикетке.

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

Смотреть назад, предыдущий символ не "-". Другими словами, убедитесь, что последний символ метки не является «-».

(?<!-)

Форсировать '.' в конце каждой метки, кроме последней, где это необязательно.

(?:\.|$)

В большинстве случаев в сочетании с вышеперечисленным, это требует как минимум двух уровней домена, что не совсем правильно, но обычно является разумным предположением. Измените с {2,} на +, если вы хотите разрешить использование TLD или неквалифицированных относительных поддоменов (например, localhost, myrouter, to.)

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

Модульные тесты для этого выражения.

Андрей Домашек
источник
1
Спасибо! Это лучшее регулярное выражение здесь. Ваше подробное объяснение и модульный тест - это бонус.
naudster
Что означает "RR"?
Wheeler
Ресурсная запись. Обычно текстовое или информационное поле, в котором рассказывается, как взаимодействовать с сервисом.
Эндрю Домашек
Это регулярное выражение неверно. Например, домен redbull. 移动 действителен, но регулярное выражение не соответствует.
pubkey
Сначала преобразовать в punycode, а затем сопоставить. Ограничения на длину в версии pre-punycode действительно сложно реализовать.
Эндрю Домашек,
8

Спасибо, что указали правильное направление в решениях для проверки доменного имени в других ответах. Доменные имена можно проверить различными способами.

Если вам нужно проверить домен IDN в удобочитаемой форме, регулярное выражение\p{L} поможет . Это позволяет сопоставить любой символ на любом языке.

Обратите внимание, что последняя часть может содержать дефисы ! В китайских именах, закодированных в кодировке Punycode, в tld могут содержаться символы Unicode.

Я пришел к решению, которое будет соответствовать, например:

  • google.com
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国 互联 网络 信息 中心. 中国
  • хп - 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. Если кто-нибудь знает, как это исправить, пожалуйста, улучшите.

PeterM
источник
Мы можем просто использовать [:alpha:]и[:digit] вместо \p{L}. Работает нормально.
puchu
Вы не можете проверить IDN таким образом, не преобразовав его сначала в punycode. Например, с вашим expr 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国проверяется как действительный, но после преобразования IDN слишком много байтов на метку. \ p {L} соответствует символам, а не байтам кода Punycode (которые варьируются от символа к символу), поэтому количество повторов бесполезно при попытке ограничить его размер после преобразования.
Эндрю Домашек 02
Хороший момент, каждая часть ограничена 64 байтами. Однако мы не можем проверить это с помощью RegExp, поэтому требуются дальнейшие шаги проверки с использованием декодера punycode, который не удастся с вашим примером имени хоста. Китайцы должны сходить с ума от этого ограничения.
PeterM 02
7
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}$

[домен - только строчные буквы и 0–9] [может иметь дефис] + [TLD - только нижний регистр, должен содержать от 2 до 7 букв]
http://rubular.com/ отлично подходит для тестирования регулярных выражений!
Изменить: обновлен максимум TLD до 7 символов для .rentals, как указал Дэн Кэддиган.

Крис
источник
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})$
zaTricky
источник
3

Для новых gTLD

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu
Бен Кейл
источник
2
Пожалуйста, дайте нам более подробную информацию, что вы ответите лучше, чем другие? Что вам больше подходит? Пожалуйста, отредактируйте свое сообщение, чтобы добавить информацию.
Sven R.
Как я уже писал: новые gTLD. Домены с символами Unicode, а также TLD в формате Unicode.
Бен Кейл
1
@BenKeil: О чем эта часть: (? <! -)
jor
@jor, который отрицательно оглядывается. Проверьте это shortcutfoo.com/app/dojos/regex/cheatsheet
Мухаммад Файзан
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 ( Примечание: в настоящее время работает только в Chrome, поскольку регулярное выражение использует ретроспективу, которая поддерживается только в ECMA2018. )

При проверке доменов можно выбрать один из двух подходов.

Установленное соответствие FQDN (теоретическое определение, редко встречается на практике):

  • не более 253 символов (согласно RFC-1035 / 3.1 , RFC-2181/11 )
  • не более 63 символов на этикетку (согласно RFC-1035 / 3.1 , RFC-2181/11 )
  • разрешены любые символы (согласно RFC-2181/11 )
  • TLD не могут быть полностью числовыми (согласно RFC-3696/2 )
  • Полные доменные имена могут быть записаны в полной форме, включая корневую зону (конечную точку).

Практическое / консервативное соответствие FQDN (практическое определение, ожидаемое и поддерживаемое на практике):

  • Подбор по книгам со следующими исключениями / дополнениями
  • допустимые символы: [a-zA-Z0-9.-]
  • метки не могут начинаться или заканчиваться дефисом (согласно RFC-952 и RFC-1123 / 2.1 )
  • Минимальная длина TLD составляет 2 символа, максимальная длина составляет 24 символа в соответствии с существующими в настоящее время записями.
  • не соответствует конечной точке
thisismydesign
источник
2
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]+(\.[a-zA-Z]+)$
Пользователь неизвестен
источник
5
-1 для добавления {2,4}. Возможно иметь односимвольные TLD (однако в настоящее время их нет в корне). А как насчет .mobile? .associates? Оба являются действительными TLD и будут отклонены этим регулярным выражением. data.iana.org/TLD/tlds-alpha-by-domain.txt
Тим
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})-> только для приема двух номеров

если что-то превышает два, ([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])это регулярное выражение позаботится об этом.

Если мы хотим выполнить сопоставление хотя бы один раз, +будет использоваться.

прийа
источник
0

^ [A-Za-Z0-9] [- A-Za-Z0-9]. (. [AZ] {2,3}) + [A-Za-Z0-9] [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
  • ^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{0,30})\.[a-z-1-9]{2,})$

проверит такие домены как яндекс.рфпосле кодирования.

https://regex101.com/r/Hf8wFM/1 - песочница

Данила Кулаков
источник
0

Следующее регулярное выражение извлекает sub, root и 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
landen99
источник