2009-02-09 2 views
2

Я пытаюсь извлечь доменное имя из строки на C#. Вы не обязательно должны использовать регулярные выражения, но мы должны быть в состоянии извлечь 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,

ответ

15
  1. Если нет схемы (без двоеточия в строке), добавьте «http: //», чтобы сделать ее допустимым URL.

  2. Проложить строку до Uri constructor.

  3. Доступ к Uri's Host property.

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

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

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

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

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

+0

+1 для использования существующих объектов –

+1

Существует библиотека C# с открытым исходным кодом, которая использует publicsuffix.org для анализа доменов, здесь: http://code.google. ком/р/имя_домен-анализатор / –

0

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

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

http://regexlib.com/CheatSheet.aspx

найти также хорошие данные о регулярных выражений в coding horror.

+0

Я пробовал это сам уже около часа. Спасибо за ссылки, хотя. –

0

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

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

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

+0

Мне действительно не нужен ЛЮБОЙ ДВУ, мне нужны самые популярные. –

+0

Это регулярное выражение охватывает все популярные TLD (.anything и .co.anything). Предполагается, что вы удалите конечную косую черту, если она есть. –

+0

Есть много, много популярных SLD, которые не связаны с .co. – bobince

0

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

Смежные вопросы