2010-11-06 6 views
29

Новый Рубину, как бы я получить расширение файла из URL, как:Как получить расширение файла из URL-адреса?

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

Кроме того, как бы я форматировать эту строку в C# Я хотел бы сделать:

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

Я настоятельно рекомендую использовать URI или библиотеки Адресный/URI. Хотя вы можете напрямую вводить значения в URL-адрес с помощью форматирования, библиотеки предлагают множество приятных функций для разделения URL-адреса на его компоненты, его пересоздания и обеспечения правильности структурирования URL-адреса. –

ответ

61

использование File.extname

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

Для форматирования строки

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

, так что если возвращаемое значение равно "", как бы проверить это в выражении if? if extesion == ""? – Blankman

+1

'if extension.empty?' –

+5

Похоже, что 'File.extname' не будет удалять строку запроса. Поэтому, если ваш URL-адрес «http: //www.example.com/download.mp3? Hello = world», он вернет '.mp3? Hello = world'. Просто нужно иметь в виду. –

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

Вы получите расширение для URL-адреса (самым простым способом). Теперь для вывода форматирования:

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

Ни одно из решений не связано с параметрами запроса, поэтому вам может потребоваться добавить URI.parse. Для второй части «http://www.example.com/#{filename}.#{extension» будет делать – Zaki

+2

И более красиво ' url.split ('.'). last' и '" http://www.example.com/%s.%s "% [имя_файла, расширение]'. –

+1

Что делать, если URL-адрес «http://www.example.com/dir»? –

2

Вы можете использовать Руби URI class, как это, чтобы получить фрагмент URI (т.е. относительного пути к файлу) и разделить его на последнее вхождение точки (это будет также работать, если URL содержит часть запроса):

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

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

Опять же, зачем нужны регулярные выражения, когда он может просто вызвать 'string.split()'? –

+0

Удалено RegExp, пока вы комментировали;) – AdrianoKF

+0

Для таких кассет, как «http://www.example.com/asdf123.php?myparam=1234.435.24». –

22

Это работает для файлов со строкой запроса

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

также возвращает «», если файл не имеет расширения

+0

, но это не удастся: «http://recyclewearfashion.com» или, по крайней мере, дает неверный ответ – Itzik984

+0

@ Itzik984, у которого есть недопустимый протокол (отсутствует http (s)), поэтому недействительный URI – Orlando

+1

это не удастся для «http: // recyclewearfashion.com» :) – Itzik984

0

Я понимаю, что это древний вопрос, но вот еще один голос за использование Addressable. Вы можете использовать .extname метод, который работает по желанию даже со строкой запроса:

Addressable::URI.parse('http://www.example.com/asdf123.gif').extname # => ".gif" 
Addressable::URI.parse('http://www.example.com/asdf123.gif?foo').extname # => ".gif" 
Смежные вопросы