检查 URL 在 elixir 中是否有效
Check if a URL is valid in elixir
我想检查给定的 URL 是否有效,最好是 url 是否也解析。
首先,我将如何检查字符串有效性(即正则表达式)
其次,有没有一种方法可以查看 URL 是否真的解析为 Internet 上的资源?
谢谢
我不会使用正则表达式,而是使用 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 结构的 "host" 字段。如果它是相对资源,那么它将是 nil
。此外,如果缺少方案,即 http://
或 ftp://
,方案将为 nil。路径也应该在那里(“/”),即使它只是站点的根路径。然后你的验证是这些是否是 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/")
然后您可以将此 "valid" uri 传递给 :inet.gethostbyname/1
iex(18)> :inet.gethostbyname(to_char_list a.host)
{:ok, {:hostent, 'google.com', [], :inet, 4, [{216, 58, 217, 46}]}}
如果由于某种原因失败 :inet.gethostbyname/1
将 return {:error, :nxdomain}
我想检查给定的 URL 是否有效,最好是 url 是否也解析。
首先,我将如何检查字符串有效性(即正则表达式)
其次,有没有一种方法可以查看 URL 是否真的解析为 Internet 上的资源?
谢谢
我不会使用正则表达式,而是使用 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 结构的 "host" 字段。如果它是相对资源,那么它将是 nil
。此外,如果缺少方案,即 http://
或 ftp://
,方案将为 nil。路径也应该在那里(“/”),即使它只是站点的根路径。然后你的验证是这些是否是 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/")
然后您可以将此 "valid" uri 传递给 :inet.gethostbyname/1
iex(18)> :inet.gethostbyname(to_char_list a.host)
{:ok, {:hostent, 'google.com', [], :inet, 4, [{216, 58, 217, 46}]}}
如果由于某种原因失败 :inet.gethostbyname/1
将 return {:error, :nxdomain}