检查url是否有效

6
我试图检查URL是否有效或无效。第7、8个检查返回错误的输出结果。
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只是一个子域名。我不会费心在正则表达式中明确包含它。 - David Sherret
1
很多东西都可以成为有效的URL,例如http://xyz.mysite.org.ru。我想真正的测试是尝试加载它。 - Yuriy Galanter
1
https://gist.github.com/dperini/729294 - Mulan
4
ww.google.com 是一个有效的域名。 - sp00m
你的正则表达式可以验证 .--.wkh 或者 6-..oqw 但是会拒绝 google.fr - sp00m
2
我会说这个问题与提出的重复问题不同,因为ECMA和PHP使用两种不同风格的正则表达式。 - Chris Sobolewski
2个回答

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") 这个例子,也会返回 'true',但实际上期望的结果应该是 'false'。 - patrick
现在没问题了,只要注意s必须小写。 - Joyce

0

7的问题是(www\.)?允许0或1个www.,而[a-z0-9\-\.]允许.。由于只有ww.,所以(www\.)?将其视为0,[a-z0-9\-\.]捕获ww.

8的问题是\.[a-z]{3}仅允许.com.net等。它强制要求最后一个.后面的字符串长度为3个字符。由于只有2个字符,所以不匹配。

不要试图重新发明轮子:什么是检查字符串是否为有效URL的最佳正则表达式?


2
不幸的是,该页面上的 RegExp 是 PHP 的,而不是所要求的 JavaScript。 - patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接