Що таке регулярний вираз, який відповідає дійсному доменному імені без субдомену?


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 та деяких японських доменів, я впевнений, що вам доведеться подумати двічі, перш ніж використовувати для цього регулярний вираз. Моя особиста думка полягає в тому, що регулярного вираження недостатньо для підтвердження домену в реальному домені. FYI, ось майже повний список доменів та списку доменів другого рівня з кодом країни: static.ayesh.me/misc/SO/tlds.txt
Айеш К

1
Дивіться мою відповідь на відповідне запитання щодо перевірки імені хоста .
САМ

2
Часто забувають: для повноцінних імен домену вам слід відповідати періоду після Tld.
schmijos

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,}$/

Але зауважте, що це відкине безліч дійсних доменів.


Приємно дякую, що цей, здається, працює. Які типи доменів не пройдуть перевірку ви знаєте?
Домінік

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}) + $
трансіллад

1
x.com не проходив би тут
Ніл МакГуйган

4
@Neil: Ти маєш рацію. В оригінальному запитанні було задано 3-63 символи (див. Редагування 3). Він може бути змінений для підтримки доменів один-символів досить легко: /^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/. Але це все ще відкидає тонни дійсних речей ...
Камерон

85

Я знаю, що це трохи старе повідомлення, але в усіх регулярних виразах тут відсутній один дуже важливий компонент: підтримка доменних імен IDN.

Іменні доменні імена починаються з xn--. Вони включають розширені UTF-8 символів у доменних іменах. Наприклад, чи знаєте ви, що "♡ .com" - дійсне доменне ім'я? Так, "love heart dot com"! Для перевірки доменного імені потрібно дозволити http://xn--c6h.com/ пройти перевірку.

Зауважте, щоб використовувати цей регулярний вираз, вам потрібно буде перетворити домен у малі регістри, а також використовувати бібліотеку IDN, щоб переконатися, що ви кодуєте доменні імена в ACE (також відомий як "ASCII сумісне кодування"). Одна гарна бібліотека - GNU-Libidn.

idn (1) - інтерфейс командного рядка до інтернаціоналізованої бібліотеки доменних імен. Наступний приклад перетворює ім'я хоста в UTF-8 в кодування ACE. Отримана URL-адреса https: //nic.xn--flw351e/ може бути використана як кодований ACE еквівалент https: // nic. 谷 歌 / .

  $ 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 зберігає список делегованих tlds, які можна використовувати для перегляду деяких прикладів доменів 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
Зауважте, що це підтримуватиме лише один піддомен, що більше, ніж це, призведе до помилки. Це не те, на що ви нападаєте, якщо не використовуєте його для внутрішніх сайтів тощо ... Швидка спроба дозволити йому підтримувати більше субдоменів:/^((?!-))(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
Але lonely tld's не працюють :( Наприклад 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недійсний.
Pawel Krakowiak

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. Не слід вказувати особливий регістр останньої мітки, яка не відрізняється від інших (і тепер додано багато розширень зі змінною довжиною, jsut, як і всі інші мітки в субдоменах. Зауважте, що мітки IDNA можуть також з’являтися пунктограми (у такому випадку буде "- - "сегмент у мітці, єдиний випадок, коли" - "дозволено в мітках. Нарешті, підкреслення недійсне скрізь у всіх мітках.
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 Що ви маєте на увазі під точною відповідністю?
Ярослав Ставничий

1
Всі інші відповіді не спрацювали для мене, але ця.
Danny Coulombe

У мене була подібна вимога, коли я хочу уникнути крапки з комою та комою в кінці, я намагався багато, але успіху внизу немає - це Regex, який я використовую 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


3
Примітка. Це дійсне (поки рідкісне) ім'я домену www.my---domain.com
Chris Bier

17
Не зрізає це новим TLD, наприклад.photography
Сем Фігуероа

2
@SamFigueroa Вам просто доведеться змінити довжину
Steel Brain

3
не повинно бути перевірки на TLD, він не відрізняється від субдоменів. І базування регулярного вираження на нинішньому availabletlds не є підтвердженням у майбутньому.
Loïc Faure-Lacroix

1
Запропонувати останнім шматочком {2,63}: див. Stackoverflow.com/questions/9238640/…
Eric Dobbs

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 ваш регекс містить сміття нульової ширини повз останній знак питання, тому кожен, хто його копіює, буде неприємно здивований
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,}$

Це в основному відповідь mkyong і додатково:

  • Максимальна довжина 255 октетів, включаючи префікси довжини та нульовий корінь.
  • Дозволити трейлінг "." для явного кореня dns.
  • Дозволити провідні "_" для RR доменних служб, (помилки: не застосовує 15 знаків макс для _ міток, а також не потрібно принаймні один домен вище службових RR)
  • Відповідає всім TLD.
  • Не захоплює мітки субдоменів.

По частинах

Шукати, обмежити максимальну довжину від ^ $ до 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"?
Уїлер

Запис ресурсів. Зазвичай текстове або інформаційне поле, яке розповідає про те, як взаємодіяти із службою.
Андрій Домашек

Цей регулярний вираз не є правильним. Наприклад, домен redbull. 移动 дійсний, але регулярний вираз не збігається.
pubkey

Перетворіть спочатку в Punycode, а потім співставте. Обмеження довжини у версії препікоді дуже важко здійснити.
Андрій Домашек

8

Дякуємо, що вказали правильний напрямок у рішеннях перевірки доменних імен в інших відповідях. Доменні імена можна перевірити різними способами.

Якщо вам потрібно перевірити домен IDN у читаному для людини вигляді, \p{L}допоможе регулярний вираз . Це дозволяє зіставити будь-який символ будь-якою мовою.

Зверніть увагу, що остання частина може містити також дефіси ! Так як імена китайців, кодовані пунктодом, можуть мати символи unicode в 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}. Це чудово працює.
пучу

Ви не можете перевірити IDN таким чином, попередньо не перетворивши його на punycode. Наприклад, з вашим expr, 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国перевіряється як дійсний, але після перетворення IDN це занадто багато байтів на мітку. \ p {L} відповідає символам, а не байтодам балів (які змінюються від символу до символу), тому повторне підрахунок не допомагає, коли намагаються обмежити розмір після конверсії.
Андрій Домашек

Добре, що кожна частина обмежена 64 байтами. Однак ми не можемо перевірити це за допомогою RegExp, тому необхідні подальші кроки перевірки за допомогою декодера punycode - що не вдасться з вашим прикладом імені хоста. Кишинець повинен бути злий від цього обмеження.
PeterM

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буде недійсним. Просто зробіть це необмеженими символами чи чимось подібним.
Адріан

5

Ще недостатньо реп. Для коментарів. У відповідь на рішення пакета, я виявив, що мені потрібно скорегувати три елементи:

  • Тире та підкреслення було переміщено через тире, що інтерпретується як діапазон (як у "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
Будь ласка, дайте нам ще детальну інформацію про те, що ви відповідаєте на краще, ніж інші? Що вам більше відповідає? Будь ласка, відредагуйте своє повідомлення безпосередньо, щоб додати інформацію.
Свен Р.

Як я писав: нові gTLD. Домени з символами unicode, а також unicode TLD.
Бен Кейл

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 можна записати у повному вигляді, який включає кореневу зону (крапка)

Практичне / консервативне узгодження FQDN (практичне визначення, очікуване та підтримуване на практиці):

  • відповідність підручників із наступними винятками / доповненнями
  • дійсні символи: [a-zA-Z0-9.-]
  • Мітки не можуть починатися або закінчуватися дефісами (відповідно до RFC-952 та RFC-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})-> лише для прийому двох чисел

якщо щось перевищує два, ([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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.