Skip to content

Instantly share code, notes, and snippets.

@javan
Created August 7, 2015 00:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save javan/6aaebfeb5fe415498028 to your computer and use it in GitHub Desktop.
Save javan/6aaebfeb5fe415498028 to your computer and use it in GitHub Desktop.
DOM URL validation
isValidURL = (value) ->
input = document.createElement("input")
input.type = "url"
input.value = value
input.required = true
input.checkValidity()
valid = ["http://foo.com/blah_blah", "http://foo.com/blah_blah/", "http://foo.com/blah_blah_(wikipedia)", "http://foo.com/blah_blah_(wikipedia)_(again)", "http://www.example.com/wpstyle/?p=364", "https://www.example.com/foo/?bar=baz&inga=42&quux", "http://✪df.ws/123", "http://userid:password@example.com:8080", "http://userid:password@example.com:8080/", "http://userid@example.com", "http://userid@example.com/", "http://userid@example.com:8080", "http://userid@example.com:8080/", "http://userid:password@example.com", "http://userid:password@example.com/", "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://例子.测试", "http://उदाहरण.परीक्षा", "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", "http://1337.net", "http://a.b-c.de", "http://223.255.255.254"]
invalid = ["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--c.de/", "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"]
console.group("Valid URLs")
for url in valid
if isValidURL(url)
console.log("PASS", url)
else
console.log("FAIL", url)
console.groupEnd()
console.group("Invalid URLs")
for url in invalid
if isValidURL(url)
console.log("FAIL", url)
else
console.log("PASS", url)
console.groupEnd()
Valid URLs:
PASS http://foo.com/blah_blah/
PASS http://foo.com/blah_blah_(wikipedia)
PASS http://foo.com/blah_blah_(wikipedia)_(again)
PASS http://www.example.com/wpstyle/?p=364
PASS https://www.example.com/foo/?bar=baz&inga=42&quux
PASS http://✪df.ws/123
PASS http://userid:password@example.com:8080
PASS http://userid:password@example.com:8080/
PASS http://userid@example.com
PASS http://userid@example.com/
PASS http://userid@example.com:8080
PASS http://userid@example.com:8080/
PASS http://userid:password@example.com
PASS http://userid:password@example.com/
PASS http://142.42.1.1/
PASS http://142.42.1.1:8080/
PASS http://➡.ws/䨹
PASS http://⌘.ws
PASS http://⌘.ws/
PASS http://foo.com/blah_(wikipedia)#cite-1
PASS http://foo.com/blah_(wikipedia)_blah#cite-1
PASS http://foo.com/unicode_(✪)_in_parens
PASS http://foo.com/(something)?after=parens
PASS http://☺.damowmow.com/
PASS http://code.google.com/events/#&product=browser
PASS http://j.mp
PASS ftp://foo.bar/baz
PASS http://foo.bar/?q=Test%20URL-encoded%20stuff
PASS http://مثال.إختبار
PASS http://例子.测试
PASS http://उदाहरण.परीक्षा
PASS http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com
PASS http://1337.net
PASS http://a.b-c.de
PASS http://223.255.255.254
Invalid URLs:
PASS http://
FAIL http://.
FAIL http://..
FAIL http://../
PASS http://?
PASS http://??
PASS http://??/
PASS http://#
PASS http://##
PASS http://##/
FAIL http://foo.bar?q=Spaces should be encoded
PASS //
PASS //a
PASS ///a
PASS ///
FAIL http:///a
PASS foo.com
FAIL rdar://1234
FAIL h://test
FAIL http:// shouldfail.com
PASS :// should fail
FAIL http://foo.bar/foo(bar)baz quux
FAIL ftps://foo.bar/
FAIL http://-error-.invalid/
FAIL http://a.b--c.de/
FAIL http://-a.b.co
FAIL http://a.b-.co
FAIL http://0.0.0.0
FAIL http://10.1.1.0
FAIL http://10.1.1.255
FAIL http://224.1.1.1
FAIL http://1.1.1.1.1
FAIL http://123.123.123
FAIL http://3628126748
FAIL http://.www.foo.bar/
FAIL http://www.foo.bar./
FAIL http://.www.foo.bar./
FAIL http://10.1.1.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment