2010-08-23 32 views
1

我想驗證URL(使用java腳本)只接受格式 - http://www.test.com。我正在嘗試下面的代碼,但它也接受test.com和http://www.test.com.com驗證表單中的URL http://www.test.com

var URLReg = new RegExp(); 
URLReg.compile("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$"); 
if (!URLReg.test(form["URL"].value)) { 
    alert("You must supply a valid URL."); 
    return false; 
} 

這是什麼問題? :(

在此先感謝

+8

爲什麼'http:// www.test.com'有效,而'http:// test.com'或'http:// www.test.com.com'不是?是什麼讓它比其他「更有效」?你會測試接受'http:// stackoverflow.com /'? – 2010-08-23 09:24:06

+4

添加到@Joachim所說的。 'www.test.com.com'是一個有效的網址,你爲什麼要禁止它? – 2010-08-23 09:28:07

+0

@KukePHP:我認爲你的代碼中還有一個sintax錯誤,因爲你是在字符串中創建正則表達式,所以在'?'之前忘記了雙斜槓\\你需要斜槓'/'之前的反斜槓。你的正則表達式的最後一部分:「... [A-Za-z0-9 _/\\ - \\%\\\\\\\\\\\\\\\\\\\\\] +」也許我甚至找到了太多沒有必要的反斜槓現在。但爲了以防萬一。 :) – 2010-08-23 11:57:25

回答

0

我用這句話 - 它的最好的,我發現:

^(https?://)?(([\w!~*'().&=+$%-]+:)?[\w!~*'().&=+$%-][email protected])?(([0-9]{1,3}\.){3}[0-9]{1,3}|([\w!~*'()-]+\.)* 
([\w^-][\w-]{0,61})?[\w]\.[a-z]{2,6})(:[0-9]{1,4})?((/*)|(/+[\w!~*'().;?: 
@&=+$,%#-]+)+/*)$ 
0

看看

^[A-Za-z]+:\/\/[A-Za-z0-9-/]+\.com$ 

是你想要的

5

如果你想部分地堅持你的代碼,一個快速修復可以簡單地使用這些:

"^((https?\\://www\\.)|(www\\.))[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-\\%\\&\\?\\.\\=\\+]+$"(接受 「http://www ......」 和 「WWW ...」)

"^(https?\\://www\\.)[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-\\%\\&\\?\\.\\=\\+]+$"(只接受 「http://www ......」 而不是 「WWW ......」)

上述任何一個都不接受沒有「www」的域名。

反正你的代碼(以及還有調整的代碼,我放在上面)是錯誤的,因爲他們都證實這樣的好域名:

你的正則表達式也會接受這樣的廢話:

  • 歡呼:// WWW ...

爲了驗證只是域部分迫使WWW要輸入),您可以使用此:

var URLReg = /^((https?\://wwww\.)|(www\.))([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+[a-z]+$/i; 

這1韓元't驗證ok好像廢話一樣:

BTW:這也將驗證http://www.domain.com.com但這不是一個錯誤,因爲一個子域網址可能是這樣的:http://www.subdomain.domain.com,它是有效的! ,而且幾乎沒有辦法(或至少沒有操作簡單的方法),以驗證爲正確的域名TLD用正則表達式,因爲你將不得不寫內嵌到你的正則表達式所有可能的域名頂級域名ONE BY ONE這樣的:

var URLReg = /^((https?\://wwww\.)|(www\.))([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+(com|it|net|uk|de)$/i; 

(最後一個,例如將驗證只與.COM/.NET /由Matchi.com提供回到/。它/ .co.uk結尾的域名) 新TLD總是出來,所以你必須調整你把每一個新東西都表達出來,這很奇怪!


還爲了驗證一個URL的其餘部分,你可以在正則表達式的末尾添加remainig部分:

var URLReg = /^((https?\://wwww\.)|(www\.))([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+[a-z]+(\/[a-z0-9_\-\%\&\?\.\=\+]*)*$/i;

它仍然不是完美的,因爲有人爲可以輸入:

http://www.domain.com/????hello

,它會驗證好了,但現在我累了,對不起! :)