2015-06-21 107 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; 
}