检查 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}