Регулярное выражение для извлечения доменного имени из любого домена - PullRequest
2 голосов
/ 09 февраля 2009

Я пытаюсь извлечь имя домена из строки в C #. Вам не обязательно использовать RegEx, но мы должны быть в состоянии извлечь yourdomain.com из всего следующего:

yourdomain.com
www.yourdomain.com
http://www.yourdomain.com
http://www.yourdomain.com/
store.yourdomain.com
http://store.yourdomain.com
whatever.youdomain.com
*.yourdomain.com

Также допустим любой TLD, поэтому замените все вышеперечисленное на .net, .org, 'co'uk и т. Д.

Ответы [ 4 ]

15 голосов
/ 09 февраля 2009
  1. Если схема отсутствует (двоеточие в строке отсутствует), добавьте "http://", чтобы сделать его действительным URL.

  2. Передать строку в Uri конструктор .

  3. Доступ к Uri's Хост-свойство .

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

Невозможно отличить имена хостов, такие как «what.youdomain.com» от доменов в SLD, такие как «warwick.ac.uk», только от строк. В самом деле, есть даже некоторая неясность в отношении того, что является и не является публичным SLD, учитывая усилия некоторых регистраторов по созданию своих собственных ниш.

Распространенным подходом является ведение большого списка SLD и других суффиксов, используемых несвязанными объектами. Это то, что веб-браузеры делают, чтобы остановить нежелательный общий доступ к файлам cookie. Найдя общедоступный суффикс, вы можете добавить один ближайший префикс в имени хоста, разделенный точками, чтобы получить объект высшего уровня, отвечающий за данное имя хоста, если вы этого хотите. Списки суффиксов чертовски велики, но вы можете добавить в ответ чужие усилия .

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

Или, если все это слишком много работы, вы можете попробовать просто отрубить любой ведущий "www." Подарок!

0 голосов
/ 09 февраля 2009

Регулярное выражение не совсем соответствует вашему требованию " любой TLD", поскольку формат и количество TLD довольно велики и постоянно меняются. Если вы ограничили свои возможности:

(?<domain>[^\.]+\.([A-Z]+$|co\.[A-Z]$))

Вы бы поймали .anything и .co.anything, что, я думаю, охватывает самые реалистичные случаи ...

0 голосов
/ 09 февраля 2009

Посмотрите на этот другой ответ . Это было для PHP, но вы легко извлечете регулярное выражение из 4-5 строк PHP, и вы сможете извлечь пользу из последующего обсуждения (см. ответ Альнитака ).

0 голосов
/ 09 февраля 2009

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

http://sourceforge.net/projects/regulator/

http://regexlib.com/CheatSheet.aspx

Также можно найти полезную информацию о регулярных выражениях в ужас кодирования .

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