Санитарная обработка строк URL - PullRequest
0 голосов
/ 24 сентября 2019

Скажем, у нас есть строка

url = "http://example.com/foo/baz/../../."

Очевидно, что из оболочки Unix мы знаем, что ../../. по сути означает переход на две директории вверх.Следовательно, этот URL действительно будет http://example.com/.Мой вопрос заключается в том, что, учитывая эти ../ символов в строке, как мы можем очистить строку URL-адреса, чтобы она указала на фактический ресурс?

Например:

url = "http://example.com/foo/baz/../../hello.html"
url = process(url)
url = "http://example.com/hello.html"

Другой:

url = "http://example.com/foo/baz/../."
url = process(url)
url = "http://example.com/foo/"

Имейте в виду, что функция по-прежнему может принимать обычные URL-адреса (т. Е. http://example.com) и возвращать их как есть, если нет ничего для очистки

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Gem адресуемый может сделать это.

require 'addressable'
Addressable::URI.parse("http://example.com/foo/baz/../../hello.html").normalize.to_s
#=> "http://example.com/hello.html"    
0 голосов
/ 24 сентября 2019
#!/usr/bin/env ruby

# ======
## defs:

def process(url)
  url_components = url.split('/')
  url_components2 = url_components.dup

  current_index = 0

  url_components.each do |component|

    if component == '..'
      url_components2.delete_at(current_index)
      url_components2.delete_at(current_index-1)
      current_index -= 1
    elsif
      component == '.'
      url_components2.delete_at(current_index)
    else
      current_index += 1
    end

  end

  url_resolved = url_components2.join('/')
  return url_resolved
end


# =======
## tests:

urls = [
  "http://example.com/foo/baz/../../.",
  "http://example.com/foo/baz/../../hello.html",
  "http://example.com/foo/baz/../."
]

urls.each do |url|
  print url, ' => '
  puts process(url)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...