2015-06-21 163 views
4

我試圖驗證url有無http無論我做了什麼函數返回false。 我在這個網站檢查了我的正則表達式字符串: http://regexr.com/ 它看起來如我所料。JS正則表達式的URL驗證

function isUrlValid(userInput) { 
     var regexQuery = "/(http(s)?://.)?(www\.)?[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}\b([[email protected]:%_\+.~#?&//=]*)/"; 
     var url = new RegExp(regexQuery,"g"); 
     if (url.test(userInput)) { 
      alert('Great, you entered an E-Mail-address'); 
      return true; 
     } 
     return false; 
    } 

我通過將.test更改爲.match並保留正則表達式來解決此問題。

回答

14

我改變以匹配+使用斜線和工作在這裏的變化功能:(HTTP(S)://)

固定功能:

function isUrlValid(userInput) { 
    var res = userInput.match(/(http(s)?:\/\/.)?(www\.)?[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}\b([[email protected]:%_\+.~#?&//=]*)/g); 
    if(res == null) 
     return false; 
    else 
     return true; 
} 
+1

應該是'(http(s)?:\/\ /。)?(www \。)?[ - a-zA-Z0-9 @:%._ \ +〜#=] { 2,256} \。[az] {2,6} \ b([ - a-zA-Z0-9 @:%_ \ +。〜#?&=] *)'。在https://regex101.com/上檢查上述正則表達式會給出錯誤。 – saruftw

2

我相信另一個答案會拒絕一些有效的url(如大寫或長子域名),並允許一些無效的(如http://www.-example-.com或www。%@ &.com)。我試圖考慮一些額外的url語法規則(沒有進入國際化)。

function isUrlValid(userInput) { 
 
    var regexQuery = "^(https?://)?(www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z0-9]{0,61}[a-z0-9]\\.[a-z]{2,6}(/[-\\[email protected]\\+\\.~#\\?&/=%]*)?$"; 
 
    var url = new RegExp(regexQuery,"i"); 
 
    return url.test(userInput); 
 
} 
 
var input = ["https://o.sub-domain.example.com/foo/bar?foo=bar&boo=far#a%20b", 
 
      "HTTP://EX-AMPLE.COM", 
 
      "example.c", 
 
      "example-.com"]; 
 
for (var i in input) document.write(isUrlValid(input[i]) + ": " + input[i] + "<br>");

中,也允許IP地址和端口號,正則表達式是:

"^(https?://)?(((www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z‌​0-9]{0,61}[a-z0-9]\\‌​.[a-z]{2,6})|((\\d{1‌​,3}\\.){3}\\d{1,3}))‌​(:\\d{2,4})?(/[-\\[email protected]‌​\\+\\.~#\\?&/=%]*)?$‌​" 

中,也允許查詢字符串沒有域名和問號之間的斜線(這在理論上是不允許的,但在大多數現實生活中都可以使用),正則表達式是:

"^(https?://)?(((www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z‌​0-9]{0,61}[a-z0-9]\\‌​.[a‌​-z]{2,6})|((\\d‌​{1,3}\\.){3}\\d{1,3}‌​))(:\\d{2,4})?((/|\\‌​?)[-\\[email protected]\\+\\.~#\\?&‌​/=%]*)?$" 

爲了還確保每%後跟一個十六進制數,正則表達式是:

"^(https?://)?(((www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z‌​0-9]{0,61}[a-z0-9]\\‌​.[a-z]{2,6})|((\\d{1‌​,3}\\.){3}\\d{1,3}))‌​(:\\d{2,4})?((/|\\?)‌​(((%[0-9a-f]{2})|[-\‌​\[email protected]\\+\\.~#\\?&/=])*‌​))?$" 

(注:如約翰·吳在評論中提到,有正當single-letter domains

0

試試看看這個代碼。

function CheckURL(fieldId, alertMessage) { 
    var url = fieldId.value; 
    if(url !== "") 
    { 
     if (url.match(/(http(s)?:\/\/.)?(www\.)?[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}\b([[email protected]:%_\+.~#?&//=]*)/g) !== null) 
      return true; 
     else { 
      alert(alertMessage); 
      fieldId.focus(); 
      return false; 
     } 
    } 
} 

var website = document.getElementById('Website'); 
if (!CheckURL(website, "Enter a valid website address")) { 
    return false; 
}