2011-12-29 10 views
13

Sto convalidando l'URL con la seguente espressione regolare. Voglio convalidare google.com ma restituisce false. Che cosa può essere modificato in R.E qui sotto per convalidare google.com.Espressione regolare Javascript per convalidare l'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

Stai cercando di convalidare tutti gli URL oppure è necessario solo per 'google.com'? – Unknown

+1

Wrapping '(ftp | https?): \/\/+ (Www \.)?' Con '(...)?' Farà. Tuttavia, questa regex è davvero adatta alle tue esigenze? Voglio dire: '\. [A-z] {3} $' da solo esclude * molti * URL validi. – jensgram

+0

cercando di convalidare tutti gli URL. ftp può essere escluso. –

risposta

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

Sembra che google.com non stia convalidando. Aggiunti alcuni codici da convalidare. :-) – Unknown

0

^... simbolo sta dicendo inizia con così il registro finale ha un senso, vale a dire la stringa non inizia con ftp o http (s). Stai anche dicendo con che il fine che la stringa deve terminare con tre lettere che ancora una volta dove fallisce (riga 2) non finisce così. Alcune modifiche minori e dovresti essere lì.

2

Ecco qui, è necessario rendere "ftp/http (s): //" non un MUST. Uso "?" per questo.

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

Come puoi vedere, ho solo avvolto il tuo '(ftp | https?): \/\ /' In '()?'. – ArVan

+0

Come faccio a non far corrispondere un http/https? – San

46

Questa convalidare l'URL in generale

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); 
 
}

deve corrispondere

["//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); 
 
}

dovesse fallire

["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); 
 
}

Come funziona

// 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*)?" 

Tutto questo viene da questo gist, mi auguro che questo riempie tutte le vostre esigenze

+0

Questa dovrebbe essere la risposta corretta. – fuzz

+5

Ti applaudo o la regex più lunga e incomprensibile che abbia mai visto. – jpschroeder

+0

Che dire di 'http: // www.gfh',' http: // www.gfh.c' e 'http: //www.gfh: 800000'? –

5

Questo è perfetto per me. Spero che sia perfetto per qualcun altro! :)

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

+0

Cosa fornisce questa risposta che le risposte precedenti non forniscono già? – Louis

+0

@Louis quali risposte precedenti? –

+0

questo è molto meglio della risposta più votata che non funziona perché accetta qualcosa come ww.google o www.google o www.google.c .... ma il tuo funziona perfettamente .... bel lavoro – Juan

Problemi correlati