Skip to content

Instantly share code, notes, and snippets.

@sircharleswatson
Created November 12, 2015 18:01
Show Gist options
  • Save sircharleswatson/172bce1255c4901ee8e0 to your computer and use it in GitHub Desktop.
Save sircharleswatson/172bce1255c4901ee8e0 to your computer and use it in GitHub Desktop.
url_validation
defmodule Shrivel do
def valid?(url) do
regex = "^(?:(?:https?|ftp):\/\/)"
<> "(?:\S+(?::\S*)?@)?"
<> "(?:"
<> "(?!(?: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\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)"
<> "(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)*"
<> "(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,}))\.?)(?::\d{2,5})?(?:[\/?#]\S*)?$"
Regex.match?(~r/#{regex}/uim, url)
end
end
defmodule ShrivelTest do
use ExUnit.Case
doctest Shrivel
test "url is valid" do
urls = [
"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",
"jnekavmekra"
]
Enum.all? urls, &(Shrivel.valid?(&1))
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment