2010-11-06 29 views
29

Nueva a Ruby, ¿cómo iba a conseguir la extensión de archivo de una URL como:¿Cómo obtener la extensión de archivo de una url?

http://www.example.com/asdf123.gif 

Además, ¿cómo iba a dar formato a esta cadena, en C# que haría:

string.format("http://www.example.com/{0}.{1}", filename, extension); 
+3

Me gustaría recomendar encarecidamente el uso de la URI o bibliotecas direccionables/URI. Si bien puede inyectar directamente valores en la URL mediante el formato, las bibliotecas ofrecen muchas características útiles para dividir la URL en sus componentes, reconstruirla y asegurarse de que la URL esté estructurada correctamente. –

Respuesta

61

uso File.extname

File.extname("test.rb")   #=> ".rb" 
File.extname("a/b/d/test.rb") #=> ".rb" 
File.extname("test")   #=> "" 
File.extname(".profile")  #=> "" 

Para dar formato a la cadena

"http://www.example.com/%s.%s" % [filename, extension] 
+0

entonces, si el valor de retorno es "", ¿cómo verificaría eso en una declaración if? si extesion == ""? – Blankman

+1

'if extension.empty?' –

+5

Parece que 'File.extname' no quitará una cadena de consulta. Entonces, si su url es 'http: //www.example.com/download.mp3? Hello = world', entonces devolverá' .mp3? Hello = world'. Sólo algo para tener en cuenta. –

3
url = 'http://www.example.com/asdf123.gif' 
extension = url.split('.').last 

Le conseguirá la extensión de una URL (de la manera más simple posible). Ahora, para el formato de salida:

printf "http://www.example.com/%s.%s", filename, extension 
+0

Ninguna de las soluciones se refiere a los parámetros de consulta, por lo que es posible que deba agregar URI.parse Para la segunda parte, "http://www.example.com/#{{nombre de archivo}.#{extension}" hará – Zaki

+2

Y más bellamente ' url.split ('.'). last' y '" http://www.example.com/%s.%s "% [nombre de archivo, extensión]'. –

+1

¿Qué sucede si la URL es 'http://www.example.com/dir'? –

2

usted podría utilizar Ruby URI class como este para obtener el fragmento de la URI (es decir, la ruta relativa del archivo), que se dividió en la última ocurrencia de un punto (Esto también funcionará si la URL contiene una parte de consulta):

require 'uri' 
your_url = 'http://www.example.com/asdf123.gif' 
fragment = URI.split(your_url)[5] 

extension = fragment.match(/\.([\w+-]+)$/) 
+0

De nuevo, ¿por qué son necesarias las expresiones regulares cuando puede simplemente llamar a 'string.split()'? –

+0

Se eliminó el RegExp mientras comentábamos;) – AdrianoKF

+0

Para casses como "http://www.example.com/asdf123.php?myparam=1234.435.24". –

22

Esto funciona para los archivos con cadena de consulta

file = 'http://recyclewearfashion.com/stylesheets/page_css/page_css_4f308c6b1c83bb62e600001d.css?1343074150' 
File.extname(URI.parse(file).path) # => '.css' 

también devuelve "" si el archivo no tiene extensión

+0

pero esto no funcionará para: "http://recyclewearfashion.com", o, al menos, da la respuesta incorrecta – Itzik984

+0

@ Itzik984 que tiene un protocolo no válido (http (s) faltantes), por lo que no es un URI válido – Orlando

+1

este fallará para "http: // recyclewearfashion.com" también :) – Itzik984

0

que darse cuenta de esto es una antigua pregunta, pero aquí hay otro voto para el uso Addressable. Usted puede utilizar el método .extname, que funciona como se desee, incluso con una cadena de consulta:

Addressable::URI.parse('http://www.example.com/asdf123.gif').extname # => ".gif" 
Addressable::URI.parse('http://www.example.com/asdf123.gif?foo').extname # => ".gif" 
Cuestiones relacionadas