mult = (url / any)+
url = pre preamble host (path)? (query)? (fragment)? post
preamble = (protocol "www.") / protocol / "www."
host = (validhostname "." host) / (validhostname port) / (validhostname "." tld) / "localhost"
validhostname = (validhostchar)+ ("-" (validhostchar)+)*
tld = "com" / "se" / "io" / "nu" / "fi" / "no" / "org" / "dk" / "dev" / "net" / "co" / "co.uk" / "de" / "yes"
port = ":" portnr
portnr = digit{1,4}
path = "/" (validpathchar)* (path)*
validpathchar = ~r"[a-zA-Z0-9-\.]"
query = "?" queryparams
queryparams = (validhostchar)+ "=" (validhostchar)+ ("&" queryparams)*
fragment = "#" (fragmentchar)+
fragmentchar = ~r"[a-zA-Z0-9]"
validhostchar = ~r"[a-zA-Z0-9]"
protocol = scheme "://"
scheme = "http" ("s")?

any = ~r"(.|\s)+?(?=((?<=[\s\"\”(])|^).)" / ~r"(.|\s)+"
pre = ~r"((?<=[\s\"\”(])|^)"
post = ~r"(?=(([.,\"\”])|\),?)\s|\s|$)"
space = " "
dash = "-"
zero = "0"
one = "1"
onetotwo = ~"[1-2]"
onetonine = ~"[1-9]"
digit = ~"[0-9]"
num = twofifty / twohun / hun / tens
twofifty = ~"25[0-5]"
twohun = ~"2[0-4][0-9]"
hun = one digit{2}
tens = ~"[1-9]?[0-9]"
blocks = ~r"/(0|[1-9][0-9]?)"
ipv4_raw = (num "."){3} num blocks?

