2010-03-31 2 views
1

Я пытаюсь удалить все относительные слэши относительного образа из куска HTML, содержащего несколько других элементов.Использование регулярных выражений для удаления относительных косых черт

Например

<img src="../../../../images/upload/1/test.jpg /> 

должен был бы стать

<img src="http://s3.amazonaws.com/website/images/upload/1/test.jpg" /> 

Я думал о написании этого в качестве помощника рельсы, и просто проходя весь блок в метод, и сделать с помощью Nokogiri или Hpricot вместо синтаксического анализа HTML, но я не знаю.

Любая помощь будет большим

Приветствия Адам

+2

Есть ли конкретная причина, почему вы задаете регулярное выражения? Они не очень хорошо подходят для решения этой проблемы; Я думаю, вы ставите телегу перед лошадью. Вы можете получить более эффективные ответы, если вы отредактируете свой заголовок, чтобы удалить ссылку. –

ответ

3

Нет необходимости изобретать колесо, когда Пб BUILTIN «Ури» может сделать это для вас:

require 'uri' 
main_path = "http://s3.amazonaws.com/website/a/b/c" 
relative_path = "../../../../images/upload/1/test.jpg" 

URI.join(main_path, relative_path).to_s 
    # ==> "http://s3.amazonaws.com/images/upload/1/test.jpg" 
+0

Удобно. Я думал, что вам нужно будет использовать путь URI.parse (...) и некоторый File.expand_path для этого. – tadman

+0

URI.join() как я это делаю все время. Addressing :: URI в качестве альтернативы URI - это хороший модуль, потому что он немного более полнофункциональный, особенно если вам нужно работать с URL-адресами типа IDNA. http://en.wikipedia.org/wiki/Internationalized_domain_name –

1

Этот блок может помочь:

html = '<img src="../../../../images/upload/1/test.jpg />' 
absolute_uri = "http://s3.amazonaws.com/website/images" 
html.gsub(/(\.\.\/)+images/, absolute_uri) 
+0

Конечно, это работает только в том случае, если все изображения находятся под одним и тем же путем, и мы заранее знаем этот путь. – Arkku

3

Один из способов построить абсолютный путь, учитывая абсолютный URL страницы и относительный путь найдено на этой странице:

pageurl = 'http://s3.amazonaws.com/website/foo/bar/baz/quux/index.html' 
relative = '../../../../images/upload/1/test.jpg' 
absolute = pageurl.sub(/\/[^\/]*$/, '') 
relative.split('/').each do |d| 
    if d == '..' 
    absolute.sub!(/\/[^\/]*$/, '') 
    else 
    absolute << "/#{d}" 
    end 
end 
p absolute 

Alternat ively, вы можете обмануть немного:

'http:/'+File.expand_path(File.dirname(pageurl.sub(/^http:/, ''))+'/'+relative) 
Смежные вопросы