Normalize URLs to the format you need.
Add Norma
to your list of dependencies in mix.exs
:
def deps do
[
# get always the latest ñ___ñ
{:norma, ">= 0.0.0"}
]
end
Norma depends heavily on the implementation of the URI
module (part of the standard library), which was recently changed when adding support for Erlang 20. Use the module history as a guide if you encounter any weird error (specially if you suspect it's related to a regex).
iex> Norma.normalize("mazing.studio")
> "http://mazing.studio"
iex> Norma.normalize_if_valid("mazing.studio")
> {:ok, "http://mazing.studio"}
iex> Norma.normalize_if_valid("mazing")
> {:error, "Not an URL."}
iex> options = %{remove_fragment: true, force_root_path: true, remove_www: true}
iex> Norma.normalize("//www.mazing.studio:1337/test#test", options)
> "http://mazing.studio/"
Remove scheme:
iex> Norma.normalize("https://mazing.studio", %{remove_scheme: true})
> "mazing.studio"
Remove fragment:
iex> Norma.normalize("https://mazing.studio#test", %{remove_fragment: true})
> "https://mazing.studio"
Add trailing slash:
iex> Norma.normalize("https://mazing.studio/test", %{add_trailing_slash: true})
> "https://mazing.studio/test/"
Force root path:
iex> Norma.normalize("https://mazing.studio/test", %{force_root_path: true})
> "https://mazing.studio/"
Remove www
:
iex> Norma.normalize("https://www.mazing.studio", %{remove_www: true})
> "https://mazing.studio"
Downcase host:
iex> Norma.normalize("https://EXAMPLE.COM/FAQS", %{downcase_host: true})
> "https://example.com/FAQS"
def creation_changeset(params) do
norma_options = %{
remove_www: true,
force_root_path: true,
remove_fragment: true
}
%MyEntity{}
|> cast(params, @fields)
|> put_change(:url, Norma.normalize(params.url, norma_options))
end
/lib/norma/normalizer.ex
. Prefer pattern matching and guards over if
s and case
s./test/norma_test.exs
.README
.Sponsored by Mazing Studio
We love to solve problems using Elixir and Go.
Have a project you need help with? Tell us about it!