2015-06-07 16 views
14

Voglio verificare se un dato URL è valido, idealmente se l'url si risolve anche.Controlla se un URL è valido in elisir

In primo luogo, come potrei fare per solo la verifica della validità stringa (vale a dire regex)

e in secondo luogo, c'è un modo che posso vedere se l'URL in realtà si risolve a una risorsa su internet?

Grazie

risposta

16

Invece di raggiungere fuori per una regex userei il pacchetto URI per convalidare testualmente l'URI, e quindi verificare se il nome host risolve attraverso: 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} 

Nota il campo "host" della struttura URI. Se si tratta di una risorsa relativa, sarà nil. Inoltre, lo schema sarà nullo se manca lo schema, ad esempio http:// o ftp://. Il percorso dovrebbe anche essere lì ("/") anche se è solo il percorso principale del sito. Il tuo convalida allora è se uno di questi sono nil o no, qualcosa di simile:

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/") 

si può quindi passare questo URI "valido" per :inet.gethostbyname/1

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

Se per qualsiasi motivo questo non riesce :inet.gethostbyname/1 sarà return {:error, :nxdomain}

+1

Grazie mille :) Mi hai salvato da un'espressione regolare di 500 caratteri :) – TheStoneFox

+10

Vale la pena notare che URI.parse in realtà non convalida l'URL ma piuttosto si aspetta s uno per essere valido. Dovresti controllare almeno schema, host e percorso. –

+0

@ JoséValim Buon punto, l'ho aggiornato sulla base di questi suggerimenti. – Yoshiki

Problemi correlati