2011-03-16 23 views
30

En mi solicitud rieles que necesito para verificar si la URL dada por un usuario es realmente una URL. Estoy sólo se preocupa por el protocolo HTTP (HTTPS y tal vez, no he mirado en eso en absoluto), lo que me lleva a pensar que tal vez algo que ya está en los carriles que puede hacer este trabajo para mí.Comprobar si la cadena dada es una dirección URL

Si no es así: ¿se puede recomendar una expresión regular que hace esto? He encontrado algunos después de googlear, pero todos parecen tener un problema o dos según los comentarios de los usuarios.

Gracias

Respuesta

62

Utilice la URI library.

def uri?(string) 
    uri = URI.parse(string) 
    %w(http https).include?(uri.scheme) 
rescue URI::BadURIError 
    false 
rescue URI::InvalidURIError 
    false 
end 

Este es un ejemplo muy simple. La ventaja de utilizar la biblioteca URI más de una expresión regular es que se puede realizar comprobaciones complejas.

+0

En realidad, ahora que he escrito algunas pruebas con un montón de diferentes direcciones URL no válidas He encontrado que este método valida "http: //foo.invalid" como verdadero. Tal vez solo necesito jugar un poco más? –

+0

Porque en realidad es un URI válido. Si desea validar una URL, asegúrese de que exista #path y #scheme. –

+0

¿Cuál es el '% w (http https)' en su código de ejemplo? –

4

validates :url, :format => URI::regexp(%w(http https))

+1

Esto validará incorrectamente una cadena como "http: // prueba google.com " –

Cuestiones relacionadas