2016-01-22 65 views
1

我已經在這個主題上找到了很多帖子,但沒有帖子處理我的具體問題。javascript RegExp驗證url表達式

這是我用正則表達式(這個網站上找到):

function validateUrl(value){ 
     return /[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}([[email protected]:%_\+.~#?&//=]*)/i.test(value); 
} 

這證實了我的網址正確,直到到以下幾點:

mydomain.tld /我的空間/本「去(ES {WRO [納克

我的函數返回true,即使有不被允許像字符:
'"()[]{}

我不明白爲什麼這是允許的。我有這樣的:[[email protected]:%_\+.~#?&//=]
應該在我看來返回 'false' ......

+0

我還沒看着它密切,但我最初的猜測是,它只是匹配輸入的部分,但是正則表達式仍考慮部分匹配。爲了強制它檢查整個輸入字符串,你需要使用'^'和'''錨點。 –

+0

@StevenDoggart聽起來像一個答案,不是嗎? –

+0

@Thomas True,但我不想花時間確保我的預感是正確的。如果真的是答案,我很高興讓Atif獲得積分:) –

回答

2

您正則表達式幾乎工作。在字符串mydomain.tld/mypage/this'go(es{wro[ng中,它匹配mydomain.tld/mypage/this。由於您沒有在兩端放置錨點,因此它確實匹配(partially)。

只是將其更改爲:

^[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}([[email protected]:%_\+.~#?&\/\/=]*)$ 
^                  ^

LiveDemo

+0

這對我來說非常適合! – user2795648

0

請試試這個:

function validateUrl(value){ 
     return /^(http(s)?:\/\/)?(www\.)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/.test(value); 
} 
+2

解釋爲什麼原始版本不能按預期工作會很好,以便OP理解這個問題。 – Lucero