Eso no parece funcionar: 'http://:5984/asdf' =~ URI::regexpy 'http::5984/asdf' =~ URI::regexpambos devuelven 0. Esperaba que devolvieran nil porque ninguno de ellos es URI válido.
awendt
4
¿No es 5984 puerto 5984 en localhost?
mxcl
3
En realidad, comprueba si una variable contiene una URL válida. Aceptará " example com" como una URL válida. Porque contiene uno. Pero no es útil si espera que todo sea la URL.
Alexander Günther
2
gotqn: Sin embargo, esa no es una URL válida según RFC 1738.
Mikael S
12
No uses esto, es tan malo que "http:"pase esta expresión regular.
smathy
43
De manera similar a las respuestas anteriores, encuentro que usar esta expresión regular es un poco más preciso:
URI::DEFAULT_PARSER.regexp[:ABS_URI]
Eso invalidará las URL con espacios, a diferencia de lo URI.regexpque permite espacios por alguna razón.
Recientemente encontré un atajo que se proporciona para los diferentes rgexps de URI. Puede acceder a cualquiera de URI::DEFAULT_PARSER.regexp.keysdirectamente desde URI::#{key}.
Por ejemplo, :ABS_URIse puede acceder a la expresión regular desde URI::ABS_URI.
Si planea usar URI.parse en cualquier momento, este es definitivamente el camino a seguir. URI :: regexp coincide con ciertas URL que fallarán cuando luego se use URI.parse. Gracias por el consejo.
markquezada
Lamentablemente, esto solo está disponible en Ruby 1.9, no 1.8.
Steve Madsen
1
Sin embargo, esto funciona: /^#{URI.regexp}$/. El problema es que URI.regexpno se ancla. Una cadena con un espacio no valida el espacio como parte del URI, sino todo lo que conduce al espacio. Si ese fragmento parece un URI válido, la coincidencia se realiza correctamente.
Steve Madsen
3
Aplicando el comentario de awendt a sus propuestas: 'http://:5984/asdf' =~ URI::DEFAULT_PARSER.regexp[:ABS_URI]da 0, no nil; 'http::5984/asdf'=~ URI::DEFAULT_PARSER.regexp[:ABS_URI]da 0; 'http://:5984/asdf' =~ /^#{URI.regexp}$/da 0; 'http::5984/asdf' =~ /^#{URI.regexp}$/da 0 también. Ninguna de las expresiones regulares anteriores es completamente correcta, sin embargo, fallan solo en situaciones muy extrañas y esto no es un gran problema en la mayoría de los casos.
Un URI se puede clasificar además como localizador, nombre o ambos. El término "Localizador Uniforme de Recursos" (URL) se refiere al subconjunto de URI que, además de identificar un recurso, proporciona un medio para localizar el recurso describiendo su mecanismo de acceso principal (por ejemplo, su "ubicación" de red).
Dado que las URL son un subconjunto de URI, está claro que la coincidencia específica para URI coincidirá con los valores no deseados. Por ejemplo, URN :
"urn:isbn:0451450523"=~ URI::regexp
=>0
Dicho esto, hasta donde yo sé, Ruby no tiene una forma predeterminada de analizar las URL, por lo que lo más probable es que necesite una joya para hacerlo. Si necesita hacer coincidir las URL específicamente en formato HTTP o HTTPS, puede hacer algo como esto:
uri = URI.parse(my_possible_url)if uri.kind_of?(URI::HTTP)or uri.kind_of?(URI::HTTPS)# do your stuffend
uri.kind_of?(URI::HTTP)parece ser suficiente para ambos casos (http y https), al menos en ruby 1.9.3.
Andrea Salicetti
todavía sufre los problemas descritos por @skalee bajo la respuesta de los
jonuts
1
Resumen, URI.parse(string_to_be_checked).kind_of?(URI::HTTP)hace bien el trabajo.
ben
Además, un error de escritura muy común en nuestra base de datos muestra que las personas tienden a colocar muchas barras diagonales:, lo http:///neopets.comque desafortunadamente también es válido. Verificar la presencia de un nombre de host corrige esto:uri = URI(str) ; %w[http https].include?(uri.scheme) && !uri.host.nil?
Shane
19
Prefiero la joya direccionable . Descubrí que maneja las URL de manera más inteligente.
Acabo de alimentar Addressable :: URI.parse () con las cadenas más extrañas para ver qué rechaza. Aceptó cosas locas. Sin embargo, la primera cadena que no aceptó fue ":-)". Hmm.
mvw
1
¿Cómo consigue esto tantos votos a favor? Addressable::URI.parseno devuelve nil con una entrada no válida.
recolector de basura
11
Esta es una entrada bastante antigua, pero pensé en seguir adelante y contribuir:
Esto funciona mucho mejor que las soluciones anteriores. No tiene las advertencias mencionadas anteriormente y tampoco acepta uris como javascript: alert ('spam').
bchurchill
2
pero también coincide http:/, que puede que no sea lo que quieres.
Lo siguiente está marcado como válido:, "http://test.com\n<script src=\"nasty.js\">"y cualquier dominio que use uno de los 683 TLD de más de 5 caracteres, o que tenga dos o más guiones consecutivos, se marcará como no válido. Se permiten números de puerto fuera del rango 0-65535. Las direcciones FTP e IP obviamente no están permitidas, pero vale la pena señalarlas.
aidan
1
fácilmente la mejor solución más aplicable aquí para una rápida comprobación de URL. gracias
alguna dirección
4
Esto es un poco antiguo, pero así es como lo hago. Utilice el módulo URI de Ruby para analizar la URL. Si se puede analizar, entonces es una URL válida. (Pero eso no significa accesible).
URI admite muchos esquemas, además, puede agregar esquemas personalizados usted mismo:
irb> uri = URI.parse "http://hello.it"rescuenil=>#<URI::HTTP:0x10755c50 URL:http://hello.it>
irb> uri.instance_values
=>{"fragment"=>nil,"registry"=>nil,"scheme"=>"http","query"=>nil,"port"=>80,"path"=>"","host"=>"hello.it","password"=>nil,"user"=>nil,"opaque"=>nil}
irb> uri = URI.parse "http:||bra.ziz"rescuenil=>nil
irb> uri = URI.parse "ssh://hello.it:5888"rescuenil=>#<URI::Generic:0x105fe938 URL:ssh://hello.it:5888>[26] pry(main)> uri.instance_values
=>{"fragment"=>nil,"registry"=>nil,"scheme"=>"ssh","query"=>nil,"port"=>5888,"path"=>"","host"=>"hello.it","password"=>nil,"user"=>nil,"opaque"=>nil}
Consulte la documentación para obtener más información sobre el módulo URI.
Me encontré con esto tratando de solucionar un error de segmento. El uso URI.parsefue en realidad la causa de esto en Ruby 2.5.5: cambié a la respuesta de @jonuts a continuación si no le importa que algunos casos extraños no se concreten. Para mis propósitos no me importaba, así que eso era ideal.
el n00b
3
En general,
/^#{URI::regexp}$/
funcionará bien, pero si solo desea hacer coincidir httpo https, puede pasarlos como opciones al método:
/^#{URI::regexp(%w(http https))}$/
Eso tiende a funcionar un poco mejor, si desea rechazar protocolos como ftp://.
¿Qué pasa con el esquema mailto? ¿O telnet, gopher, nntp, rsync, ssh o cualquiera de los otros esquemas? Las URL son un poco más complicadas que HTTP y FTP.
mu es demasiado corto
Escribir expresiones regulares para validar las URL es difícil. ¿Por qué molestarse?
Rimian
@Rimian, tienes que molestarte porque todo lo que URIpuedo hacer está roto. Vea los comentarios debajo de las tantas respuestas arriba votadas. No estoy seguro de si la respuesta de Janie es correcta, pero votando a favor, por lo que es de esperar que la gente lo considere más en serio. Por cierto, termino haciéndolo url.start_with?("http://") || url.start_with?("https://")porque solo necesito HTTP y los usuarios deben ser responsables de usar las URL adecuadas.
Respuestas:
Utilice el
URI
módulo distribuido con Ruby:Como dijo Alexander Günther en los comentarios, verifica si una cadena contiene una URL.
Para verificar si la cadena es una URL, use:
Si solo desea verificar las URL web (
http
ohttps
), use esto:fuente
'http://:5984/asdf' =~ URI::regexp
y'http::5984/asdf' =~ URI::regexp
ambos devuelven 0. Esperaba que devolvieran nil porque ninguno de ellos es URI válido."http:"
pase esta expresión regular.De manera similar a las respuestas anteriores, encuentro que usar esta expresión regular es un poco más preciso:
Eso invalidará las URL con espacios, a diferencia de lo
URI.regexp
que permite espacios por alguna razón.Recientemente encontré un atajo que se proporciona para los diferentes rgexps de URI. Puede acceder a cualquiera de
URI::DEFAULT_PARSER.regexp.keys
directamente desdeURI::#{key}
.Por ejemplo,
:ABS_URI
se puede acceder a la expresión regular desdeURI::ABS_URI
.fuente
/^#{URI.regexp}$/
. El problema es queURI.regexp
no se ancla. Una cadena con un espacio no valida el espacio como parte del URI, sino todo lo que conduce al espacio. Si ese fragmento parece un URI válido, la coincidencia se realiza correctamente.'http://:5984/asdf' =~ URI::DEFAULT_PARSER.regexp[:ABS_URI]
da 0, no nil;'http::5984/asdf'=~ URI::DEFAULT_PARSER.regexp[:ABS_URI]
da 0;'http://:5984/asdf' =~ /^#{URI.regexp}$/
da 0;'http::5984/asdf' =~ /^#{URI.regexp}$/
da 0 también. Ninguna de las expresiones regulares anteriores es completamente correcta, sin embargo, fallan solo en situaciones muy extrañas y esto no es un gran problema en la mayoría de los casos.URI::DEFAULT_PARSER.regexp[:ABS_URI]
es idéntico a/\A\s*#{URI::regexp}\s*\z/
El problema con las respuestas actuales es que un URI no es una URL .
Dado que las URL son un subconjunto de URI, está claro que la coincidencia específica para URI coincidirá con los valores no deseados. Por ejemplo, URN :
Dicho esto, hasta donde yo sé, Ruby no tiene una forma predeterminada de analizar las URL, por lo que lo más probable es que necesite una joya para hacerlo. Si necesita hacer coincidir las URL específicamente en formato HTTP o HTTPS, puede hacer algo como esto:
fuente
uri.kind_of?(URI::HTTP)
parece ser suficiente para ambos casos (http y https), al menos en ruby 1.9.3.URI.parse(string_to_be_checked).kind_of?(URI::HTTP)
hace bien el trabajo.http:///neopets.com
que desafortunadamente también es válido. Verificar la presencia de un nombre de host corrige esto:uri = URI(str) ; %w[http https].include?(uri.scheme) && !uri.host.nil?
Prefiero la joya direccionable . Descubrí que maneja las URL de manera más inteligente.
fuente
Addressable::URI.parse
no devuelve nil con una entrada no válida.Esta es una entrada bastante antigua, pero pensé en seguir adelante y contribuir:
Ahora puedes hacer algo como:
fuente
http:/
, que puede que no sea lo que quieres.Para mí, uso esta expresión regular:
Opción:
i
- no distingue entre mayúsculas y minúsculasx
- ignorar los espacios en blanco en expresiones regularesPuede configurar este método para verificar la validación de URL:
Para usarlo:
Prueba con URL incorrectas:
http://ruby3arabi
- el resultado no es válidohttp://http://ruby3arabi.com
- el resultado no es válidohttp://
- el resultado no es válidoPrueba con las URL correctas:
http://ruby3arabi.com
- el resultado es válidohttp://www.ruby3arabi.com
- el resultado es válidohttps://www.ruby3arabi.com
- el resultado es válidohttps://www.ruby3arabi.com/article/1
- el resultado es válidohttps://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en
- el resultado es válidofuente
"http://test.com\n<script src=\"nasty.js\">"
y cualquier dominio que use uno de los 683 TLD de más de 5 caracteres, o que tenga dos o más guiones consecutivos, se marcará como no válido. Se permiten números de puerto fuera del rango 0-65535. Las direcciones FTP e IP obviamente no están permitidas, pero vale la pena señalarlas.Esto es un poco antiguo, pero así es como lo hago. Utilice el módulo URI de Ruby para analizar la URL. Si se puede analizar, entonces es una URL válida. (Pero eso no significa accesible).
URI admite muchos esquemas, además, puede agregar esquemas personalizados usted mismo:
Consulte la documentación para obtener más información sobre el módulo URI.
fuente
URI.parse
fue en realidad la causa de esto en Ruby 2.5.5: cambié a la respuesta de @jonuts a continuación si no le importa que algunos casos extraños no se concreten. Para mis propósitos no me importaba, así que eso era ideal.En general,
funcionará bien, pero si solo desea hacer coincidir
http
ohttps
, puede pasarlos como opciones al método:Eso tiende a funcionar un poco mejor, si desea rechazar protocolos como
ftp://
.fuente
También puede usar una expresión regular, tal vez algo como http://www.geekzilla.co.uk/View2D3B0109-C1B2-4B4E-BFFD-E8088CBC85FD.htm asumiendo que esta expresión regular es correcta (no la he verificado por completo) lo siguiente muestra la validez de la URL.
Los resultados del ejemplo anterior:
fuente
URI
puedo hacer está roto. Vea los comentarios debajo de las tantas respuestas arriba votadas. No estoy seguro de si la respuesta de Janie es correcta, pero votando a favor, por lo que es de esperar que la gente lo considere más en serio. Por cierto, termino haciéndolourl.start_with?("http://") || url.start_with?("https://")
porque solo necesito HTTP y los usuarios deben ser responsables de usar las URL adecuadas.