Ruby / Rails 3.1: учитывая строку URL, удалите путь - PullRequest
9 голосов
/ 20 июля 2011

Учитывая любую допустимую строку HTTP / HTTPS, я хотел бы проанализировать / преобразовать ее так, чтобы конечный результат был точно корнем строки.

Так даны URL:

http://foo.example.com:8080/whatsit/foo.bar?x=y
https://example.net/

Хотелось бы получить результаты:

http://foo.example.com:8080/
https://example.net/

Я обнаружил документацию для URI :: Parser не очень доступной.

Мое первоначальное, наивное решение было бы простым регулярным выражением типа:

/\A(https?:\/\/[^\/]+\/)/

(То есть: соответствует первому слешу после протокола.)

Мысли и решения приветствуются. И извиняюсь, если это дубликат, но мои результаты поиска не были релевантными.

Ответы [ 3 ]

26 голосов
/ 09 декабря 2012

С URI :: join :

require 'uri'
url = "http://foo.example.com:8080/whatsit/foo.bar?x=y"
baseurl = URI.join(url, "/").to_s
#=> "http://foo.example.com:8080/"
11 голосов
/ 20 июля 2011

Используйте URI.parse, а затем установите path на пустую строку и query на nil:

require 'uri'
uri     = URI.parse('http://foo.example.com:8080/whatsit/foo.bar?x=y')
uri.path  = ''
uri.query = nil
cleaned   = uri.to_s # http://foo.example.com:8080

Теперь у вас есть очищенная версияв cleaned.Извлекать то, что вы не хотите, иногда проще, чем просто захватывать то, что вам нужно.

Если вы сделаете только uri.query = '', вы получите http://foo.example.com:8080?, что, вероятно, не то, что вы хотите.

2 голосов
/ 20 июля 2011

Вы можете использовать uri.split(), а затем соединить части вместе ...

ВНИМАНИЕ: Это немного небрежно.

url = "http://example.com:9001/over-nine-thousand"
parts = uri.split(url)
puts "%s://%s:%s" % [parts[0], parts[2], parts[3]]

=> "http://example.com:9001"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...