2011-12-29 35 views
13

Tôi đang xác thực URL bằng biểu thức chính quy sau đây. Tôi cũng muốn xác thực google.com nhưng nó trả về false. Những gì có thể được thay đổi trong R.E bên dưới để xác thực google.com.Biểu thức chính quy Javascript để xác thực URL

console.log(learnRegExp('http://www.google-com.123')); // false 
console.log(learnRegExp('https://www.google-com.com')); // true 
console.log(learnRegExp('http://google-com.com')); // true 
console.log(learnRegExp('http://google.com')); //true 
console.log(learnRegExp('google.com')); //false 

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

bạn đang cố gắng xác thực tất cả url của người khác hoặc bạn chỉ cần cho 'google.com'? – Unknown

+1

Gói '(ftp | https?): \/\/+ (Www \.)?' Với '(...)?' Sẽ thực hiện. Tuy nhiên, regex này thực sự phù hợp với nhu cầu của bạn? Ý tôi là: '\. [A-z] {3} $' một mình không loại trừ * nhiều * URL hợp lệ. – jensgram

+0

cố gắng xác thực tất cả các url. ftp có thể được loại trừ. –

Trả lời

0
/(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ 
+0

Có vẻ như google.com không xác thực.Thêm một số mã để xác thực. :-) – Unknown

0

^... biểu tượng đang nói bắt đầu với rất log thức có ý nghĩa, ví dụ: chuỗi không bắt đầu bằng ftp hay http (s). Bạn cũng nói với ...$ rằng kết thúc chuỗi phải kết thúc bằng ba chữ cái một lần nữa, nơi nó không thành công (dòng 2) nó không kết thúc như thế này. Một số điều chỉnh nhỏ và bạn nên ở đó.

2

Ở đây bạn đi, bạn cần phải thực hiện "ftp/http (s): //" không phải là PHẢI. Sử dụng "?" cho điều này.

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

Như bạn có thể thấy, tôi chỉ bọc '(ftp | https?): \/\ /' Vào '()?'. – ArVan

+0

Tôi làm cách nào để không khớp với http/https? – San

46

này xác nhận URL nói chung

console.log('http://www.google-com.123.com', validateUrl('http://www.google-com.123.com')); // true 
 
console.log('http://www.google-com.123', validateUrl('http://www.google-com.123')); // false 
 
console.log('https://www.google-com.com', validateUrl('https://www.google-com.com')); // true 
 
console.log('http://google-com.com', validateUrl('http://google-com.com')); // true 
 
console.log('http://google.com', validateUrl('http://google.com')); //true 
 
console.log('google.com', validateUrl('google.com')); //false 
 
console.log('http://www.gfh.', validateUrl('http://www.gfh.')); //false 
 
console.log('http://www.gfh.c', validateUrl('http://www.gfh.c')); //false 
 
console.log('http://www.gfh:800000', validateUrl('http://www.gfh:800000')); //false 
 
console.log('www.google.com ', validateUrl('www.google.com ')); //false 
 
console.log('http://google', validateUrl('http://google')); //false 
 
console.log('//cdnblabla.cloudfront.net/css/app.css', validateUrl('//cdnblabla.cloudfront.net/css/app.css')); //true 
 

 
function validateUrl(value) { 
 
    return /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)[email protected])?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value); 
 
}

nên Phù hợp

["//www.google.com", "//cdnblabla.cloudfront.net/css/app.css", "http://✪df.ws/123", "http://userid:[email protected]:8080", "http://userid:[email protected]:8080/", "http://[email protected]", "http://[email protected]/", "http://[email protected]:8080", "http://[email protected]:8080/", "http://userid:[email protected]", "http://userid:[email protected]/", "http://142.42.1.1/", "http://142.42.1.1:8080/", "http://➡.ws/䨹", "http://⌘.ws", "http://⌘.ws/", "http://foo.com/blah_(wikipedia)#cite-1", "http://foo.com/blah_(wikipedia)_blah#cite-1", "http://foo.com/unicode_(✪)_in_parens", "http://foo.com/(something)?after=parens", "http://☺.damowmow.com/", "http://code.google.com/events/#&product=browser", "http://j.mp", "ftp://foo.bar/baz", "http://foo.bar/?q=Test%20URL-encoded%20stuff", "http://مثال.إختبار", "http://例子.测试"].map(function(url) { 
 
    console.log(url, validateUrl(url)); 
 
}); 
 

 
function validateUrl(value) { 
 
    return /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)[email protected])?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value); 
 
}

nên thất bại

["http://", "http://.", "http://..", "http://../", "http://?", "http://??", "http://??/", "http://#", "http://##", "http://##/", "http://foo.bar?q=Spaces should be encoded", "//", "//a", "///a", "///", "http:///a", "foo.com", "rdar://1234", "h://test", "http:// shouldfail.com", ":// should fail", "http://foo.bar/foo(bar)baz quux", "ftps://foo.bar/", "http://-error-.invalid/", "http://-a.b.co", "http://a.b-.co", "http://0.0.0.0", "http://10.1.1.0", "http://10.1.1.255", "http://224.1.1.1", "http://1.1.1.1.1", "http://123.123.123", "http://3628126748", "http://.www.foo.bar/", "http://www.foo.bar./", "http://.www.foo.bar./", "http://10.1.1.1", "http://10.1.1.254"].map(function(url) { 
 
    console.log(url, validateUrl(url)); 
 
}); 
 

 
function validateUrl(value) { 
 
    return /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)[email protected])?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value); 
 
}

Làm thế nào nó hoạt động

// protocol identifier 
"(?:(?:(?:https?|ftp):)?//)" 
// user:pass authentication 
"(?:\\S+(?::\\S*)[email protected])?" 
"(?:" 
// IP address exclusion 
// private & local networks 
"(?!(?:10|127)(?:\\.\\d{1,3}){3})" 
"(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" 
"(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" 
// IP address dotted notation octets 
// excludes loopback network 0.0.0.0 
// excludes reserved space >= 224.0.0.0 
// excludes network & broacast addresses 
// (first & last IP address of each class) 
"(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" 
"(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" 
"(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" 
"|" 
// host name 
"(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" 
// domain name 
"(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*" 
// TLD identifier 
"(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))" 
// port number 
"(?::\\d{2,5})?" 
// resource path 
"(?:[/?#]\\S*)?" 

Tất cả điều này xuất phát từ gist này, tôi hy vọng rằng đây điền vào tất cả nhu cầu của bạn

+0

Đây phải là câu trả lời đúng. – fuzz

+5

Tôi hoan nghênh bạn cho hoặc regex dài nhất và khó hiểu nhất mà tôi từng thấy. – jpschroeder

+0

Điều gì về 'http: // www.gfh.',' http: // www.gfh.c' và 'http: //www.gfh: 800000'? –

5

Điều này hoàn hảo cho tôi. Tôi hy vọng nó sẽ hoàn hảo cho người khác! :)

/^((https?):\/\/)?([w|W]{3}\.)+[a-zA-Z0-9\-\.]{3,}\.[a-zA-Z]{2,}(\.[a-zA-Z]{2,})?$/

+0

Câu trả lời này cung cấp những câu trả lời nào trước đây chưa cung cấp? – Louis

+0

@Louis câu trả lời trước nào? –

+0

điều này tốt hơn nhiều so với câu trả lời được bỏ phiếu nhiều nhất không hoạt động vì bất kỳ điều gì như ww.google hoặc www.google hoặc www.google.c .... nhưng bạn hoạt động hoàn hảo .... công việc tốt đẹp – Juan

Các vấn đề liên quan