2009-02-09 204 views
2

確定字符串是否代表網址的最佳方法是什麼?我需要讓用戶輸入一個表單的網址,但是如何驗證輸入?應允許用戶輸入「http://www.google.com」或「www.vg.no」等字符串,但不應輸入「http://」。此外,還有像「tv2.no」這樣的網頁很難驗證。如果我檢查字符串是否包含「www」或「http://」,我有一個強烈的線索,但我仍然不能100%確定。我能100%確定嗎?我不這麼認爲,但也許這裏的一些精美的頭腦可以啓發我?如何判斷一個字符串是否是網址?

+1

如果您查找「www」,您無任何線索。 Blogspot博客和其他網站(其中包括您現在正在使用的網站)中的無數博客都沒有,它們是有效的地址。 – 2009-02-09 09:15:56

+0

你能告訴我們更多關於你的驗證將被使用的場景嗎? – 2009-02-09 09:23:51

回答

3

首先,嘗試使用正則表達式驗證輸入文本是否爲格式正確的URL。如果檢查確定,請嘗試使用DNS查找來驗證主機是否已知。不要忘記localhost或127.0.0.1的特殊情況。還要照顧他們的IP地址指定的主機。如果這些檢查是可以的,你可能想嘗試一個實際的連接。

如果這些檢查失敗,您可以修改輸入文本並再次檢查。可能的修改包括:

  • 前插http://
  • 前插www.
  • 追加.com.org.net,無論
  • 追加:8080:8888,無論
  • 混合任何上述溶液
  • 試試還預先file:///本地訪問
2

怎麼樣使用Regular Expression

確切的實施方式取決於您使用的語言。

+0

我認爲我們都知道正則表達式可以用於模式匹配,我想他是在尋求一種啓發式方法來允許人們可讀的'urls'被接受,即slashdot.org而不是http://slashdot.org – falstro 2009-02-09 08:59:50

+0

不是像slashdot.org這樣的東西只是正則表達式應該接受的字符串的一個子集? – 2009-02-09 09:22:38

1

要合理確定的最簡單方法是使用正則表達式,以確保至少有兩個域名組件。這樣你可以處理大多數不好的情況。它應該是這個樣子:

/^(http:\/\/)?(\w+)(\.\w+)+$/ 
+0

「毛驢」通過該正則表達式,並不是一個有效的地址(包含空間和所有) – 2009-02-09 09:01:15

0

如果你不想要求他們輸入http://(或https://),那麼你真的可以去的唯一的事情是字符串是否包含一個 」。」 (我假設你不需要處理「內部」服務器?)。你也可以對已知的域進行驗證並檢查無效字符,但除此之外幾乎任何事情都會發生。

至於實際的實現,如果你可以忍受的話,正則表達式就是要走的路。如果你是谷歌,毫無疑問有無數的驗證URL的例子。

1

如果你不打算強制它成爲一個有效的URI(即,使該方案可選),那麼唯一的選擇是嘗試通過HTTP連接到它。

0

我認爲最快捷的方法是通過正則表達式測試。但是這並不能證明它的有效網址是否有效

3

請注意,以下兩者也是有效的網址。你想允許他們嗎?

  • localhost
  • 208.77.188.166
1

您可以從您的應用程序做一個DNS查找,這將讓任何一輪「我不知道,如果它是一個真正的地址」。

6

道歉的驗證功能爲隨後的表達,但它似乎捕捉到大部分(如果不是全部)情況:

^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~/|/)?(?#Username:Password)(?:\w+:\w­[email protected])? 
(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains) 
(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[­a-z]{2}))(?#Port) 
(?::[\d]{1,5})?(?#Directories)(?:(?:(?:/(?:[-\w~!$+|.,=]|%­[a-f\d]{2})+)+|/)+|\?|#)? 
(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(­?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*) 
(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w­~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor) 
(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})+­)?(?#What not to end in)[^.!,:;?]$ 
3

我的建議是不完全的驗證所有。相反,使用基於正則表達式的方法,如果不匹配,可以給出一個軟警告:「你寫的東西看起來不是一個有效的地址,你確定這是你想要寫的東西嗎?」。

絕對不要試圖連接到地址的想法。這會給你帶來各種令人討厭的安全問題,包括讓你的網站用於其他網站的拒絕服務攻擊。這會使你陷入法律糾紛。

做DNS查詢代價高昂,但如果您認爲它值得您花費,則可行。

相關問題