2009-11-21 52 views
3

我無法弄清楚這一點。我需要從FQDN中提取二級域。例如,所有的這些都需要返回 「example.com」:用於從FQDN提取二級域的正則表達式?

  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:8080bar.foo.example.com:8080。有任何想法嗎?

回答

4

我用這個正則表達式成功從您的測試案例列表匹配「example.com」。

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

點字符(「。」)需要轉義爲「\」。 「。」正則表達式模式中的字符匹配任何字符。

此外,您提供的正則表達式模式要求在域名匹配之前有一個或多個單詞字符,後跟一個點(模式的這個部分「(?(\ w +))。」),並假設那個角色應該是逃跑的)。這無法匹配輸入「example.com」,因爲在域名匹配之前沒有單詞字符和點。

我改變了模式,使主機名匹配的將有「1個或多個單詞字符後面加一個點」零個或多個匹配。這將匹配「foo.example.com」中的「foo」和「foo.bar.example.com」中的「foo.bar」。

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在.Net Framework正則表達式語法中匹配字母數字[a-zA-Z0-9]。提問者提供的模式將不匹配破折號字符,該字符是主機名的有效字符。 – 2009-11-21 05:51:48

2

這假定您已驗證其他地方的fqdn的內容(例如:允許的破折號,不帶下劃線或其他非字母數字字符),並且儘可能自由。

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

匹配的主機名成分如果存在的話(包括多個附加的水平):

bar.foo.example.com:8000將匹配:

  • 主機名:bar.foo(可選)
  • 域名:example.com
  • 端口:8000(可選)