2011-05-08 64 views
0

我想有一種方法來確定輸入是否爲域。確定輸入是否爲域

例輸入:

@stackexchange.com 
@gmail.com 
@google 

邏輯:如何去這樣做

1. First determine if the first character is an @ 
2. If the input ends in a domain ext, .X or .XX or .XXX 
3. Then determine if the domain (stackexchange, gmail, google) are not blacklisted. For example I might want to blacklist gmail. 

建議?這會住在控制器或模型中嗎?將正則表達式做到這一點的正確方法或將減慢?由於

思路:

1. Use params[:q][0,1] 
+0

不要忘記,域有一個可選的'.'底。 – hammar 2011-05-08 18:01:01

+0

@Hammar,最後?真?你能舉出一個在現實生活中的例子/ – AnApprentice 2011-05-08 18:02:06

+0

'''是DNS系統的根源,但由於它始終存在,所以拼寫出來是可選的,因此在實踐中並不常見。請參閱[完全限定的域名](http://en.wikipedia.org/wiki/Fully_qualified_domain_name)。 – hammar 2011-05-08 18:05:55

回答

2

就像電子郵件地址,域可以看起來是正確的,但不能不是可以達到或連接到域的最基本的測試。

如果您正在查找電子郵件地址,您可以檢查@,但不會告訴您它是否爲域。域名沒有@標誌。

域至少有一個.,如.com。他們有一個已知的頂級域名,即頂級域名,即.com.me.info。頂級域名的問題在於它們被開放給任何人希望它們成爲的目標,所以很快就很難做簡單的查詢。

在我看來,你最好的選擇是嘗試通過ping,email和http連接來連接它。這些是最有可能活着的服務。次要的選擇是嘗試使用這樣的事情來解決域名:

host example.com 

將返回:它使用%x{}或反引號

example.com has address 192.0.32.10 
example.com has IPv6 address 2620:0:2d0:200::10 

呼叫。

它可以幫助閱讀維基百科上的「Domain Name Syntax」描述了什麼特別定義了一個域名,概述:

DNS名稱可能在技術上在於一個字節的任何字符表示的的。但是,允許在DNS根區域以及大多數其他子域中使用域名的形式使用首選格式和字符集。標籤中允許的字符是ASCII字符集的一個子集,幷包含字符a到z,A到Z,數字0到9以及連字符。這個規則被稱爲LDH規則(字母,數字,連字符)。域名是以與案例無關的方式解釋的。標籤不能以連字符開頭或結尾。

RFC 3696 - Application Techniques for Checking and Transformation of Names會給你完整的規則。

+0

感謝錫人,這不是用於電子郵件驗證。這是猜測用戶正在搜索的內容。如果它是一個域,那麼我知道在我的DB中打一個表> – AnApprentice 2011-05-08 17:57:16

+0

如果它不是用於電子郵件驗證,那麼'@'是一個無效的字符,應該忽略。 – 2011-05-08 18:09:17

+0

一個簡單的DNS查找應該就足夠了,除非您還需要驗證主機是否可用。 – hammar 2011-05-08 21:33:30

1

正則表達式就是你要找的。對於前面帶@的域,它會是這樣的:

possible_domain =~ /\[email protected]([-_a-zA-Z0-9]+\.[a-z]{1,3})\Z/ 
domain_to_check_against_a_blacklist = $1 

你想用它做什麼?保存它,只有當它有效?那麼你應該看看validationsvalidates_format_of

+0

見下文。不保存,只需猜測允許應用執行正確搜索類型的輸入即可 – AnApprentice 2011-05-08 18:00:21