我想检查一个给定的URL是否有效,理想情况下,如果url也解析了。
首先,我将如何检查字符串有效性(即正则表达式)
其次,有没有办法让我看到网址是否真的解析为互联网上的资源?
由于
答案 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 %>