检查elixir中的URL是否有效

时间:2015-06-07 18:03:00

标签: elixir

我想检查一个给定的URL是否有效,理想情况下,如果url也解析了。

首先,我将如何检查字符串有效性(即正则表达式)

其次,有没有办法让我看到网址是否真的解析为互联网上的资源?

由于

1 个答案:

答案 0 :(得分:19)

我不会使用正则表达式而是使用URI包来文本验证URI,然后检查主机名是否通过以下方式解析:inet.gethostbyname:

iex(1)> URI.parse("http://google.com/")
%URI{authority: "google.com", fragment: nil, host: "google.com",
path: "/", port: 80, query: nil, scheme: "http", userinfo: nil}

注意"主持人" URI结构的字段。如果它是相对资源,那么这将是nil。如果方案(即http://ftp://丢失,则另外方案将为零。路径也应该在那里(" /"),即使它只是站点的根路径。然后,您的验证是否nil中的任何一个是defmodule Validation do def validate_uri(str) do uri = URI.parse(str) case uri do %URI{scheme: nil} -> {:error, uri} %URI{host: nil} -> {:error, uri} %URI{path: nil} -> {:error, uri} uri -> {:ok, uri} end end end {:ok, uri} = Validation.validate_uri("http://google.com/") ,如下所示:

iex(18)> :inet.gethostbyname(to_char_list a.host)
{:ok, {:hostent, 'google.com', [], :inet, 4, [{216, 58, 217, 46}]}}

然后你可以通过这个"有效" uri到:inet.gethostbyname/1

:inet.gethostbyname/1

如果由于某种原因导致失败{:error, :nxdomain}将返回<% if current_user %> <% if current_user.quality? %> <%= render 'shared/quality_nav' %> <% else %> <%= render 'shared/nav' %> <% end %> <% end %>