Мне нужно подтвердить доменное имя:
google.com
stackoverflow.com
Таким образом, домен в самом чистом виде - даже не субдомен вроде www.
- Символы должны быть только az | AZ | 0-9 и период (.) И тире (-)
- Часть имени домена не должна начинаться или заканчиваться тире (-) (например, -google-.com)
- Часть имени домена должна содержать от 1 до 63 символов.
Расширение (TLD) может быть любым в соответствии с правилами №1 на данный момент, я могу проверить их по списку позже, хотя оно должно состоять из 1 или более символов.
Изменить: TLD, по-видимому, составляет 2-6 символов в его нынешнем виде
нет. 4 исправлено: ДВУ на самом деле должен быть помечен как «субдомен», поскольку он должен включать такие вещи, как .co.uk - я бы предположил, что единственно возможная проверка (помимо проверки по списку) будет «после первой точки должна быть одна или больше символов по правилам # 1
Большое спасибо, поверьте, я попробовал!
regex
validation
domain-name
Dominic
источник
источник
Ответы:
Что ж, это
довольно просто,немного хитрее, чем кажется (см. Комментарии), учитывая ваши конкретные требования:Но учтите, что это приведет к отклонению множества действительных доменов.
источник
g.co
- действительное доменное имя, ноg
состоит только из одного символа./^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,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 .
Это волшебное регулярное выражение должно охватывать большинство доменов (хотя, я уверен, есть много допустимых крайних случаев, которые я пропустил):
При выборе регулярного выражения для проверки домена вы должны увидеть, соответствует ли домен следующему:
Если эти три домена не проходят, возможно, ваше регулярное выражение не разрешает допустимые домены!
Посетите страницу поддержки интернационализированных доменных имен в Руководстве по международной языковой среде Oracle для получения дополнительной информации.
Не стесняйтесь опробовать регулярное выражение здесь: http://www.regexr.com/3abjr
ICANN ведет список делегированных TLD, который можно использовать для просмотра некоторых примеров доменов IDN.
Редактировать:
Это регулярное выражение остановит домены, у которых в конце имени хоста стоит знак «-», как допустимые. Кроме того, он позволяет использовать неограниченное количество поддоменов.
источник
/^((?!-))(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
to.
( to. ) Действительный URL-адрес с контентом.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
недействительно.xn--stackoverflow.com
это недопустимое имя, поскольку «stackoverflow» не может быть преобразован из Punycode. Однако это выходит за рамки того, что может делать регулярное выражение. В качестве общего замечания,xn--[a-z0-9]+
метки будут только для IDN, тогда какxn--[a-z0-9]+\-[a-z0-9]+
обозначать сочетание символов ASCII и не-ASCIIМой 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
Вот обновленное правило
https://www.debuggex.com/r/y4Xe_hDVO11bv1DV
теперь он проверяет
-
или_
в начале или в конце метки домена.источник
{2,6}
для нового TLD необходимо будет обновить критерии. Наверное{2,}
.Моя ставка:
Разъяснение:
Доменное имя строится из сегментов. Вот один сегмент (кроме финального):
Он может содержать от 1 до 63 символов, не начинается и не заканчивается знаком «-».
Теперь добавьте '.' к нему и повторить хотя бы один раз:
Затем прикрепите последний сегмент длиной от 2 до 63 символов:
Протестируйте здесь: http://regexr.com/3au3g
источник
Небольшая поправка - последняя часть должна быть до 6. Следовательно,
Самый длинный TLD
museum
(6 символов) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domainsисточник
.photography
available
tld не является залогом будущего.{2,63}
: см. Stackoverflow.com/questions/9238640/…Принятый ответ не работает для меня, попробуйте следующее:
Посетите эти примеры модульных тестов для проверки.
источник
{2,6}
на что-нибудь другое, и оно будет работать. Mine:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Этот ответ предназначен для доменных имен (включая служебные RR), а не для имен хостов (например, имени хоста электронной почты).
В основном это ответ Макьонга, а также:
По частям
Lookahead, ограничьте максимальную длину от ^ $ до 253 символов с необязательным завершающим литералом '.'
Посмотри вперед, следующий символ не является «-», и ни один символ «_» не следует за любыми символами перед следующим «.». Иными словами, убедитесь, что первый символ метки не является «-», и только первый символ может быть «_».
От 1 до 63 разрешенных символов на этикетке.
Смотреть назад, предыдущий символ не "-". Другими словами, убедитесь, что последний символ метки не является «-».
Форсировать '.' в конце каждой метки, кроме последней, где это необязательно.
В большинстве случаев в сочетании с вышеперечисленным, это требует как минимум двух уровней домена, что не совсем правильно, но обычно является разумным предположением. Измените с {2,} на +, если вы хотите разрешить использование TLD или неквалифицированных относительных поддоменов (например, localhost, myrouter, to.)
Модульные тесты для этого выражения.
источник
Спасибо, что указали правильное направление в решениях для проверки доменного имени в других ответах. Доменные имена можно проверить различными способами.
Если вам нужно проверить домен IDN в удобочитаемой форме, регулярное выражение
\p{L}
поможет . Это позволяет сопоставить любой символ на любом языке.Обратите внимание, что последняя часть может содержать дефисы ! В китайских именах, закодированных в кодировке Punycode, в tld могут содержаться символы Unicode.
Я пришел к решению, которое будет соответствовать, например:
Регулярное выражение:
Проверить и настроить здесь
ПРИМЕЧАНИЕ. Это регулярное выражение является достаточно разрешительным, как и допустимый набор символов текущего имени домена.
ОБНОВЛЕНИЕ : еще более упрощено, как
a-aA-Z\p{L}
и только\p{L}
ПРИМЕЧАНИЕ 2: Единственная проблема заключается в том, что он будет соответствовать доменам с двойными точками в нем ..., например
masełk..owski.pl
. Если кто-нибудь знает, как это исправить, пожалуйста, улучшите.источник
[:alpha:]
и[:digit]
вместо\p{L}
. Работает нормально.中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国
проверяется как действительный, но после преобразования IDN слишком много байтов на метку. \ p {L} соответствует символам, а не байтам кода Punycode (которые варьируются от символа к символу), поэтому количество повторов бесполезно при попытке ограничить его размер после преобразования.[домен - только строчные буквы и 0–9] [может иметь дефис] + [TLD - только нижний регистр, должен содержать от 2 до 7 букв]
http://rubular.com/ отлично подходит для тестирования регулярных выражений!
Изменить: обновлен максимум TLD до 7 символов для .rentals, как указал Дэн Кэддиган.
источник
.photography
было бы недействительно. Просто сделайте неограниченное количество символов или что-то в этом роде.Недостаточно репутации для комментариев. В ответ на решение paka я обнаружил, что мне нужно настроить три элемента:
Перед:
После:
источник
Для новых gTLD
источник
Как уже указывалось, не очевидно, что субдомены могут быть определены в практическом смысле (например,
.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 (теоретическое определение, редко встречается на практике):
Практическое / консервативное соответствие FQDN (практическое определение, ожидаемое и поддерживаемое на практике):
[a-zA-Z0-9.-]
источник
источник
Вот полный код с примером:
источник
Спасибо @mkyong за основу для моего ответа. Я изменил его, чтобы поддерживать более длинные приемлемые метки.
Кроме того, «localhost» технически является допустимым доменным именем. Я изменю этот ответ, чтобы он соответствовал интернационализированным доменным именам.
источник
([a-zA-Z]{1,2})
-> для приема только двух символов.([0-9]{1,2})
-> только для приема двух номеровесли что-то превышает два,
([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])
это регулярное выражение позаботится об этом.Если мы хотим выполнить сопоставление хотя бы один раз,
+
будет использоваться.источник
Примеры, которые работают:
Это также будет работать для расширений
Примеры, которые не подойдут:
он будет работать даже с самым длинным расширением домена
".versicherung"
источник
^((?!-))(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 - песочница
источник
Следующее регулярное выражение извлекает sub, root и tld данного домена:
Протестировано для следующих доменов:
источник
Я сделал следующее, чтобы просто получить домен вместе с протоколом. Пример: https://www.facebook.com/profile/user/ ftp://182.282.34.337/movies/M
используйте приведенный ниже шаблон регулярного выражения: [a-zA-Z0-9] +: //.*? /
даст вам результат: https://www.facebook.com/ ftp://192.282.34.337/
источник