確定字符串是否代表網址的最佳方法是什麼?我需要讓用戶輸入一個表單的網址,但是如何驗證輸入?應允許用戶輸入「http://www.google.com」或「www.vg.no」等字符串,但不應輸入「http://」。此外,還有像「tv2.no」這樣的網頁很難驗證。如果我檢查字符串是否包含「www」或「http://」,我有一個強烈的線索,但我仍然不能100%確定。我能100%確定嗎?我不這麼認爲,但也許這裏的一些精美的頭腦可以啓發我?如何判斷一個字符串是否是網址?
回答
首先,嘗試使用正則表達式驗證輸入文本是否爲格式正確的URL。如果檢查確定,請嘗試使用DNS查找來驗證主機是否已知。不要忘記localhost或127.0.0.1的特殊情況。還要照顧他們的IP地址指定的主機。如果這些檢查是可以的,你可能想嘗試一個實際的連接。
如果這些檢查失敗,您可以修改輸入文本並再次檢查。可能的修改包括:
- 前插
http://
- 前插
www.
- 追加
.com
,.org
,.net
,無論 - 追加
:8080
,:8888
,無論 - 混合任何上述溶液
- 試試還預先
file:///
本地訪問
怎麼樣使用Regular Expression?
確切的實施方式取決於您使用的語言。
我認爲我們都知道正則表達式可以用於模式匹配,我想他是在尋求一種啓發式方法來允許人們可讀的'urls'被接受,即slashdot.org而不是http://slashdot.org – falstro 2009-02-09 08:59:50
不是像slashdot.org這樣的東西只是正則表達式應該接受的字符串的一個子集? – 2009-02-09 09:22:38
要合理確定的最簡單方法是使用正則表達式,以確保至少有兩個域名組件。這樣你可以處理大多數不好的情況。它應該是這個樣子:
/^(http:\/\/)?(\w+)(\.\w+)+$/
「毛驢」通過該正則表達式,並不是一個有效的地址(包含空間和所有) – 2009-02-09 09:01:15
如果你不想要求他們輸入http://(或https://),那麼你真的可以去的唯一的事情是字符串是否包含一個 」。」 (我假設你不需要處理「內部」服務器?)。你也可以對已知的域進行驗證並檢查無效字符,但除此之外幾乎任何事情都會發生。
至於實際的實現,如果你可以忍受的話,正則表達式就是要走的路。如果你是谷歌,毫無疑問有無數的驗證URL的例子。
如果你不打算強制它成爲一個有效的URI(即,使該方案可選),那麼唯一的選擇是嘗試通過HTTP連接到它。
我認爲最快捷的方法是通過正則表達式測試。但是這並不能證明它的有效網址是否有效
請參閱CPAN上的Regexp::Common,特別是R::C::URI和R::C::URI::http。即使你自己不能使用模塊,源代碼中也有正則表達式。這是一個好的開始。
請注意,以下兩者也是有效的網址。你想允許他們嗎?
localhost
208.77.188.166
您可以從您的應用程序做一個DNS查找,這將讓任何一輪「我不知道,如果它是一個真正的地址」。
你可以使用的Zend_Uri
道歉的驗證功能爲隨後的表達,但它似乎捕捉到大部分(如果不是全部)情況:
^(?#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)[^.!,:;?]$
我的建議是不完全的驗證所有。相反,使用基於正則表達式的方法,如果不匹配,可以給出一個軟警告:「你寫的東西看起來不是一個有效的地址,你確定這是你想要寫的東西嗎?」。
絕對不要試圖連接到地址的想法。這會給你帶來各種令人討厭的安全問題,包括讓你的網站用於其他網站的拒絕服務攻擊。這會使你陷入法律糾紛。
做DNS查詢代價高昂,但如果您認爲它值得您花費,則可行。
- 1. 判斷一個字符串是否是另一個子字符
- 2. 如何判斷一個URL是否是Intranet網址?
- 3. 如何判斷一個字符串是否包含Guid作爲子字符串?
- 4. 在Perl中,如何判斷字符串是否是數字?
- 5. 如何判斷某個字母是否在字符串中 - javascript
- 6. 如何判斷pick()的結果是否是字符串
- 7. 是否有任何算法來判斷一個字符串是否有意義
- 8. 如何判斷一個C++模板類型是否是C風格字符串
- 9. 如何判斷一個字符串是否代表一個整數?
- 10. 如何判斷字符串中是否有數字?
- 11. 如何判斷未知數字是否在字符串中?
- 12. 如何判斷一個字符是否對html有效?
- 13. 我如何判斷一個字符串是否只包含字母和空格
- 14. 如何判斷某個字符串之前的任何字符是否匹配?
- 15. PHP如何判斷一個字符串是否包含某個值
- 16. 如何判斷一個String是否真的是Java中的一個字符?
- 17. 如何判斷VARCHAR變量是否包含子字符串?
- 18. 如何判斷const char *是否指向有效的字符串?
- 19. 如何判斷boost :: split_iterator是否在字符串中間開始?
- 20. 如何判斷正則表達式是否匹配字符串?
- 21. 如何判斷用戶是否輸入了字符串?
- 22. 如何判斷一個IP地址是否私密?
- 23. 如何判斷Request.Form中的值是否是一個數字? (C#)
- 24. 如何判斷網頁是否存在?
- 25. bash - 如何判斷變量是字符串還是數字
- 26. python unicode:如何判斷一個字符串是否需要解碼爲utf-8?
- 27. 如何判斷一個字符串是否未在bash shell腳本中定義?
- 28. 如何判斷一個字符串是否以hh:mm格式在python中?
- 29. 如何判斷一個字符串是否使用不同的語言。 (非ASCII)
- 30. 在shell中,如何判斷一個字符串是否以路徑名開頭?
如果您查找「www」,您無任何線索。 Blogspot博客和其他網站(其中包括您現在正在使用的網站)中的無數博客都沒有,它們是有效的地址。 – 2009-02-09 09:15:56
你能告訴我們更多關於你的驗證將被使用的場景嗎? – 2009-02-09 09:23:51