看草稿的时候,看到一段代码,想到之前被不知道谁随手抄来的正则坑的内牛满面…
下面是一段相对全面的用例测试,可以考虑使用,当然,如果你的要求很简单,用网上传的各种简单版,cover到自己的用例就好。
/**
* 正则表达式判断网址是否有效
*/
(function () {
"use strict";
var urlDict = [
//Bad Case
'www.baidu.com', //常规网址,未带协议头的地址
'w.baidu.com', //常规网址,短子域名
'baidu.com', //常规网址,仅有主域名
'测试.com', //非常规合法网址,中文域名不在参考之列
'1.2', //错误域名
' WWWW ', //无效字符串
'111测试', //无效字符串
//Correct Case
'http://baidu.com', //常规网址,仅有主域名
'http://www.baidu.com', //常规网址,带子域名
'https://www.baidu.com/', //常规网址,使用https协议头,带根目录
'http://www.baidu.com/api', //常规网址,有一级目录下资源
'http://www.subdomain.baidu.com/index/subdir', //常规网址,多级子域名,多级目录
'http://www.www.subdomain.baidu.com/index/subdir/', //常规网址,多级子域名,多级目录,目录地址闭合
'http://io.io' //非常规网址,多级子域名,多级目录,目录地址闭合
];
// 建议的正则
function isURL(str) {
return !!str.match(/(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/g);
}
// 不知道谁写的简单版的坑爹正则
function badRegFn(str) {
return !!str.match(/(http[s]?|ftp):\/\/[^\/\.]+?\..+\w$/g);
}
// 测试用例覆盖
(function () {
var ret = {};
var collect = function (link) {
var obj = {}, fnList = [isURL, badRegFn];
for (var i = 0, j = fnList.length; i < j; i++) {
var fn = fnList[i];
obj[fn.name] = fn.call(null, link);
}
return obj;
};
for (var i = 0, j = urlDict.length; i < j; i++) {
ret[urlDict[i]] = collect(urlDict[i]);
}
console.log(ret) , console.table(ret);
}());
}());