2013-05-09 40 views
5

我一直沒能找到這個,我試圖對我來說不是很努力。Javascript正則表達式,以匹配完全合格的域名,沒有協議,可選子域

我想只匹配結構域:

  • 不包含協議(HTTP,HTTPS,FTP)
  • 任選包括子域
  • 沒有開始連字符但可以包含連

實施例的結構域將匹配:

  • domain.com
  • example.domain.com
  • example.domain-hyphen.com
  • www.domain.com
  • example.museum

實施例的結構域將不是匹配:

  • http://example.com
  • subdomain.-example.com
  • example.com/parameter
  • example.com?anything
  • www.subdomain.domain.com

目前我有什麼:

/^(?!:\/\/)(^[a-zA-Z0-9])?.[a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$/i 

它不符合協議,允許連字符在域內,不允許在t後跟蹤字符他頂級域名,並允許一個子域名(但只有1個字符)。

我仍然需要允許任何長度的子域,不允許www.subdomain.domain.com,並且不允許使用前導連字符。

+0

你如何定義 「域」 呢?每個字都至少有一個點? – Bergi 2013-05-09 14:13:29

+0

不知道我明白。域名位於TLD之前,只能包含字母,數字和連字符。 – 2013-05-09 14:15:06

+0

那麼,這是我的(失敗)嘗試允許子域名。基本上這就是我卡住的地方,也是我添加到這個正則表達式的最後一件事。 – 2013-05-09 14:17:00

回答

12

嘗試

/^(?!:\/\/)([a-zA-Z0-9]+\.)?[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$/i 
+0

真棒夥計,就是這樣!謝謝。 – 2013-05-09 14:20:03

+7

我知道這是舊的,但它應該更新,以允許域名,如.photography,它具有超過6個字符 – Nico 2014-08-25 15:34:31

3

我們來分析一下你的正則表達式:

^(?!:\/\/) 

這是相當無用的。雖然它表明了正則表達式的意圖,但它是沒有必要的,因爲不管怎樣,下面的字符都不允許包含斜槓。

(^[a-zA-Z0-9])?. 

我想你想這是^([a-zA-Z0-9]+\.)?。您的點不會被轉義,並且在字符串開頭處只會有一個可選字符。

[a-zA-Z0-9-]+ 

如果你想這不是一開始就有一個連字符,你要麼可以使用負前瞻或更好的只是[a-zA-Z0-9][a-zA-Z0-9-]*

\.[a-zA-Z]{2,6}? 

不確定的問號在這裏所做的是什麼。無論如何都沒有回溯?

/i 

這使得明確[a-zA-Z]沒用,一個就足夠了。或者省略i標誌。

所有這些東西放在一起,我們將結束與

/^([a-z0-9]+\.)?[a-z0-9][a-z0-9-]*\.[a-z]{2,6}$/i 
+1

我知道這是舊的,但它應該更新,以允許域名,如.photography,其中有超過6個字符 – Nico 2014-08-25 15:35:06

+0

當然,但是我只分析了在問題中提出的正則表達式並且使其正常工作(沒有對意思進行評論) – Bergi 2014-08-25 15:41:08

+1

是的,您是對的,抱歉...但是當我看到它時,我想如果人們尋找答案,他們可能會複製這一個,甚至沒有考慮到它的侷限性......所以,保持原樣 – Nico 2014-08-26 11:39:06

0

我正則表達式,我想出了,而這樣做的主機名/ FQDN驗證在javascript:

FQDN:

^(?!:\/\/)(?!.{256,})(([a-z0-9][a-z0-9_-]*?\.)+?[a-z]{2,6}?)$/i

主機名或FQDN

^(?!:\/\/)(?!.{256,})(([a-z0-9][a-z0-9_-]*?)|([a-z0-9][a-z0-9_-]*?\.)+?[a-z]{2,6}?)$/i

兩個表達式使用前瞻檢查可高達255個字符的總字符串長度。他們也做一個懶惰的檢查.{x,y}?

請注意,它使用不區分大小寫的匹配/i

0

試試這個:

^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$ 

Demo