如果你想部分地堅持你的代碼,一個快速修復可以簡單地使用這些:
"^((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要輸入),您可以使用此:
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
,它會驗證好了,但現在我累了,對不起! :)
爲什麼'http:// www.test.com'有效,而'http:// test.com'或'http:// www.test.com.com'不是?是什麼讓它比其他「更有效」?你會測試接受'http:// stackoverflow.com /'? – 2010-08-23 09:24:06
添加到@Joachim所說的。 'www.test.com.com'是一個有效的網址,你爲什麼要禁止它? – 2010-08-23 09:28:07
@KukePHP:我認爲你的代碼中還有一個sintax錯誤,因爲你是在字符串中創建正則表達式,所以在'?'之前忘記了雙斜槓\\你需要斜槓'/'之前的反斜槓。你的正則表達式的最後一部分:「... [A-Za-z0-9 _/\\ - \\%\\\\\\\\\\\\\\\\\\\\\] +」也許我甚至找到了太多沒有必要的反斜槓現在。但爲了以防萬一。 :) – 2010-08-23 11:57:25