2009-11-21 2 views
3

Я не могу понять это. Мне нужно извлечь домен второго уровня из полного доменного имени. Например, все они должны вернуться "example.com":Regex для извлечения домена второго уровня из полного доменного имени?

  1. example.com
  2. foo.example.com
  3. bar.foo.example.com
  4. example.com:8080
  5. foo.example.com:8080
  6. bar.foo.example.com:8080

Вот что я до сих пор:

Dim host = Request.Headers("Host") 
    Dim pattern As String = "(?<hostname>(\w+)).(?<domainname>(\w+.\w+))" 
    Dim theMatch = Regex.Match(host, pattern) 
    ViewData("Message") = "Domain is: " + theMatch.Groups("domainname").ToString 

Он не подходит для example.com:8080 и bar.foo.example.com:8080. Есть идеи?

ответ

4

Я использовал это регулярное выражение для соответствия «example.com» из вашего списка тестовых примеров.

"(?<hostname>(\w+\.)*)(?<domainname>(\w+\.\w+))" 

Точечный символ (".") Должен быть экранирован как "\.". «.» символ в шаблоне регулярного выражения соответствует любому символу.

Также представленный вами шаблон регулярного выражения требует наличия одного или нескольких символов слова, за которым следует точка перед совпадением имени домена (эта часть «(? (\ W +)).». Я также предполагаю, что символ должен был сбежать). Это не соответствует совпадению для ввода «example.com», потому что нет символа слова и точки перед совпадением имени домена.

Я изменил шаблон так, чтобы совпадение имени хоста имело ноль или более совпадений «1 или более символов слова, за которым следует точка». Это будет соответствовать «foo» в «foo.example.com» и «foo.bar» в «foo.bar.example.com».

1

Я не знаком с VB.NET или ASP, но на тему регулярных выражений ...

  • Во-первых, вы хотите, чтобы закрепить ваше выражение с ^ и $.
  • Далее \w может соответствовать различным вещам в зависимости от реализации, языкового стандарта и т. Д., Поэтому вы можете захотеть быть явным. Например, \w может не совпадать с дефисом, действительным символом в именах доменов.
  • Возможно, вы не учитываете дополнительный номер порта.

Я уверен, что там есть более точное выражение RFC, но вот начало чему-то, что должно сработать для вас.

^([a-z0-9\-]+\.)*([a-z0-9\-]+\.[a-z0-9\-]+)(:[0-9]+)?$ 

Сломался:

([a-z0-9\-]+\.)*: Начните с нуля или более имен хостов ...
([a-z0-9\-]+\.[a-z0-9\-]+): за которыми следует две ...
имен хостов (:[0-9]+)?: с последующими необязательной декларацией порта.

Обратите внимание, что если вы имеете дело с доменом, например example.ne.jp, вы получите только .ne.jp. Кроме того, обратите внимание, что выражение вышеприведенного примера должно быть согласовано без учета регистра.

+0

\ w соответствует буквенно-цифровому [a-zA-Z0-9] в синтаксисе регулярного выражения .Net Framework. Шаблон, предоставленный вопрошателем, не будет соответствовать символу тире, который является допустимым символом для имени хоста. –

2

Предполагается, что вы подтвердили содержимое fqdn в другом месте (например, разрешенные штрихи, символы подчеркивания или другие символы, отличные от буквенно-цифровых символов), и в любом случае как можно более либеральные.

'(?:(?<hostname>.+)\.)?(?<domainname>[^.]+\.[^.]+?)(?:\:(?<port>[^:]+))?$' 

Соответствует компонент имени хоста, если присутствует (в том числе несколько дополнительных уровней):

bar.foo.example.com:8000 будет соответствовать:

  • имя хоста: bar.foo (по желанию)
  • имя_домена: example.com
  • порт: 8000 (опционально)
Смежные вопросы