2013-07-18 2 views
1

С помощью regex, как я могу удалить все до первого пути / в URL?Удалить все до первой косой черты в URL-адресе?

Пример URL: https://www.example.com/some/page?user=1&[email protected]

От этого я просто хочу /some/page?user=1&[email protected]

В том случае, если это просто корневой домен (т. Е https://www.example.com/), то я просто хочу / быть возвращены.

Домен может иметь или не иметь субдомен, и он может иметь или не иметь безопасный протокол. На самом деле, в конечном счете, просто хочу вырезать что-нибудь перед этим первым следом пути.

Если это имеет значение, я запускаю Ruby 1.9.3.

+2

** Regexes - это не волшебная палочка, которую вы волнуете при каждой проблеме, которая включает в себя строки. ** Возможно, вы захотите использовать существующий код, который уже был написан, протестирован и отлажен. В PHP используйте функцию ['parse_url'] (http://php.net/manual/en/function.parse-url.php). Perl: ['URI' module] (http://search.cpan.org/dist/URI/). Ruby: ['URI' module] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html). .NET: ['Uri' class] (http://msdn.microsoft.com/en-us/library/txt7706a.aspx) –

ответ

13

Не используйте регулярное выражение для этого. Используйте класс URI. Вы можете написать:

require 'uri' 

u = URI.parse('https://www.example.com/some/page?user=1&[email protected]') 
u.path #=> "/some/page" 
u.query #=> "user=1&[email protected]" 

# All together - this will only return path if query is empty (no ?) 
u.request_uri #=> "/some/page?user=1&[email protected]" 
+0

+1 вы били меня на 3 минуты :) – Tilo

5
require 'uri' 

uri = URI.parse("https://www.example.com/some/page?user=1&[email protected]") 

> uri.path + '?' + uri.query 
    => "/some/page?user=1&[email protected]" 

Как Gavin также отметил, что это не очень хорошая идея использовать RegExp для этого, хотя это заманчиво. У вас могут быть URL-адреса со специальными символами, даже символы UniCode, которые вы не ожидали, когда вы написали RegExp. Это особенно возможно в строке запроса. Использование библиотеки URI - более безопасный подход.

0

То же самое можно сделать с помощью String#index

индекса (подстроку [, смещение])

str = "https://www.example.com/some/page?user=1&[email protected]" 
offset = str.index("//") # => 6 
str[str.index('/',offset + 2)..-1] 
# => "/some/page?user=1&[email protected]" 
0

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

test_url1 = 'https://www.example.com/some/page?user=1&ema[email protected]' 
test_url2 = 'http://test.com/' 
test_url3 = 'http://test.com' 

regex = /^https?:\/\/[^\/]+(.*)/ 

regex.match(test_url1)[1] 
# => "/some/page?user=1&[email protected]" 

regex.match(test_url2)[1] 
# => "/" 

regex.match(test_url3)[1] 
# => "" 

Обратите внимание, что в последнем случае URL не имел задней '/' поэтому результатом является пустая строка.

Регулярное выражение (/^https?:\/\/[^\/]+(.*)/) говорит, что строка начинается с (^) http (http), необязательно с последующим s (s?), а затем :// (:\/\/), а затем, по меньшей мере, один не-косой черты ([^\/]+), за которым следуют ноль или более символов, и мы хотим захватить эти символы ((.*)).

Надеюсь, что вы найдете этот пример и объяснение образовательных, и я снова рекомендую против фактического использования регулярного выражения в этом случае. Модуль URI проще в использовании и гораздо более надежный.