Javascript / Regex для поиска только имени корневого домена без поддоменов - PullRequest
12 голосов
/ 09 августа 2010

Я провел поиск и нашел множество похожих примеров регулярных выражений, но не совсем то, что мне нужно.

Я хочу иметь возможность передать следующие URL-адреса и вернуть результаты:

  • www.google.com возвращает google.com

  • sub.domains.are.cool.google.com возвращает google.com

  • doesntmatterhowlongasubdomainis.idont.wantit.google.com возвращает google.com

  • sub.domain.google.com / нет / спасибо возвращает google.com

Надеюсь, что это имеет смысл :) Заранее спасибо! -James

Ответы [ 4 ]

10 голосов
/ 22 сентября 2010

Вы не можете сделать это с помощью регулярного выражения, потому что вы не знаете, сколько блоков в суффиксе.

Например, google.com имеет суффикс com . Чтобы перейти с subdomain.google.com на google.com , вам потребуется взять два последних блока - один для суффикса и один для google .

Если вы примените эту логику к subdomain.google.co.uk , хотя в итоге вы получите co.uk .

Вам действительно нужно найти суффикс из списка, например http://publicsuffix.org/

7 голосов
/ 29 сентября 2010

Не используйте регулярные выражения, используйте метод .split () и работайте оттуда.

var s = domain.split('.');

Если ваш вариант использования довольно узок, вы можете при необходимости проверить TLD, а затем вернуть последние 2 или 3 сегмента в зависимости от ситуации:

return s.slice(-2).join('.');

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

1 голос
/ 09 августа 2010

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

([A-Za-z0-9-]+\.([A-Za-z]{3,}|[A-Za-z]{2}\.[A-Za-z]{2}|[A-za-z]{2}))\b

РЕДАКТИРОВАТЬ:

Чтобы уточнить, он ищет:

один или несколько буквенно-цифровых символов или тире, за которыми следует буквальная точка

и затем одна из трех вещей...

  1. три или более буквенных символа (т. Е. Com / net / mil / coop и т. Д.)
  2. два буквенных символа, за которыми следует буквальная точка, за которой следуют еще два альфа(т. е. co.uk)
  3. два буквенных символа (т. е. us / uk / to и т. д.)

и в конце этого слова граница (\ b), означающаяконец строки, пробел или несловесный символ (в регулярных выражениях символами слов обычно являются буквенно-цифровые символы и подчеркивание).

Как я уже говорил, я не проводил много испытаний, но казалось,разумная отправная точка.Вам, скорее всего, придется попробовать и немного его настроить, и даже в этом случае маловероятно, что вы получите 100% для всех тестовых случаев.Существуют такие соображения, как доменные имена Unicode и все виды технически обоснованных, но вряд ли вы встретите диких вещей, которые приведут в порядок простое регулярное выражение, подобное этому, но это, вероятно, получитвам 90% + пути туда.

0 голосов
/ 07 октября 2015

Если у вас ограниченное подмножество данных, я предлагаю сделать регулярное выражение простым, например,

(([a-z\-]+)(?:\.com|\.fr|\.co.uk))

Это будет соответствовать:

www.google.com --> google.com
www.google.co.uk --> google.co.uk
www.foo-bar.com --> foo-bar.com

В моем случае я знаю, что все соответствующие URL будут сопоставлены с помощью этого регулярного выражения.

Соберите образец набора данных и проверьте его на соответствие вашему регулярному выражению. Во время создания прототипа вы можете сделать это с помощью такого инструмента, как https://regex101.com/r/aG9uT0/1.. В процессе разработки автоматизируйте его с помощью тестового сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...