diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index e9b781bcf320..7ab3f5b98210 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -11,7 +11,8 @@ // Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/; -var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; +// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987) +var URL_REGEXP = /^([0-9]+|\w+|\.|\+|\-)+:\/?\/?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/; var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/; diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js index becc6b72aa49..dbe58df6f2f3 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -2387,8 +2387,16 @@ describe('input', function() { describe('URL_REGEXP', function() { /* global URL_REGEXP: false */ it('should validate url', function() { + // See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987) expect(URL_REGEXP.test('http://server:123/path')).toBe(true); + expect(URL_REGEXP.test('https://server:123/path')).toBe(true); + expect(URL_REGEXP.test('file:///home/user')).toBe(true); + expect(URL_REGEXP.test('mailto:user@example.com?subject=Foo')).toBe(true); + expect(URL_REGEXP.test('r2-d2.c3-p0://localhost/foo')).toBe(true); + expect(URL_REGEXP.test('abc:/foo')).toBe(true); + expect(URL_REGEXP.test('http:')).toBe(false); expect(URL_REGEXP.test('a@B.c')).toBe(false); + expect(URL_REGEXP.test('a_B.c')).toBe(false); }); }); });