2013-07-18 229 views
5

我试图检查url是否有效。 7,8的检查返回错误的输出。检查url是否有效

alert('1: ' + learnRegExp('http://www.google-com.123.com')); // true 
alert('2: ' + learnRegExp('http://www.google-com.123')); // false 
alert('3: ' + learnRegExp('https://www.google-com.com')); // true 
alert('4: ' + learnRegExp('http://google-com.com')); // true 
alert('5: ' + learnRegExp('http://google.com')); //true 
alert('6: ' + learnRegExp('google.com')); //true 
alert('7: ' + learnRegExp('ww.google.com')); //false -> it returns true 
alert('8: ' + learnRegExp('www.google.co.il')); //true -> it returns false 
alert('9: ' + learnRegExp('http://ww.google.co.il')); //false 
alert('10: ' + learnRegExp('https://ww.google.co.il')); //false 

function learnRegExp(){ 
    return /((ftp|https?):\/\/)?(www\.)?[a-z0-9\-\.]{3,}\.[a-z]{3}$/ 
    .test(learnRegExp.arguments[0]); 
} 

请帮我解决它。

任何帮助赞赏!

+4

记住'www'只是一个子域。我不打算在正则表达式中明确地包含它。 –

+1

很多东西都可以成为一个有效的URL,例如'http:// xyz.mysite.org.ru'我想真正的测试会尝试并加载它 –

+1

https://gist.github.com/dperini/729294 – naomik

回答

7

试试这个:

function learnRegExp(s) {  
     var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; 
     return regexp.test(s);  
} 
+5

不幸的是,对于learnRegExp(“http:// fgsdfjgd”),这应该是'false' – patrick

0

问题的图7是(www\.)?是允许0或1 www.[a-z0-9\-\.]允许.因为它是唯一ww.然后(www\.)?把它当作0和[a-z0-9\-\.]捕获ww.

问题的图8是\.[a-z]{3}只允许.com.net等它迫使最后.后面的字符串是3个字符长。由于它只有2个字符,所以不匹配。

不要试图重新发明轮子:What is the best regular expression to check if a string is a valid URL?

+2

不幸的是,该页面上的RegExp使用的是PHP,而不是JavaScript中的请求... – patrick