2013-07-18 2 views
1

정규식을 사용하면 URL의 첫 번째 경로 인 / 앞에있는 모든 것을 제거 할 수 있습니까?URL의 첫 번째 슬래시 앞에있는 모든 것을 제거 하시겠습니까?

예 URL : 그에서 https://www.example.com/some/page?user=1&[email protected]

, 나는 그냥 그냥 루트 도메인 (. 즉 https://www.example.com/)의 경우

/some/page?user=1&[email protected]을 원한다, 나는 그냥 /이 반환하고자합니다.

도메인에 하위 도메인이있을 수도 있고 없을 수도 있으며 보안 프로토콜이 있거나 없을 수도 있습니다. 실제로 궁극적으로 첫 번째 경로 슬래시 전에 을 제거하려고합니다..

문제가 발생하면 Ruby 1.9.3을 실행하고 있습니다.

+2

** 정규 표현식은 문자열과 관련된 모든 문제에서 웨이브하는 마술 지팡이가 아닙니다 ** 이미 작성, 테스트 및 디버깅 된 기존 코드를 사용하려고합니다. PHP에서는 ['parse_url'] (http://php.net/manual/en/function.parse-url.php) 함수를 사용하십시오. Perl : ['URI' 모듈] (http://search.cpan.org/dist/URI/). Ruby : ['URI' 모듈] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html). .NET : [ '우리 클래스] (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]" 

으로는 유혹하지만, 그것은, 이것에 대한 정규식을 사용하는 것이 좋습니다 아니다. RegExp를 작성할 때 기대하지 않았던 특수 문자가 포함 된 URL (유니 코드 문자 포함)이있을 수 있습니다. 이것은 특히 쿼리 문자열에서 발생할 수 있습니다. 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

I 강하게이 경우 URI 모듈을 사용하도록 조언 동의 , 나는 정규 표현식으로 자신을 크게 생각하지 않는다. 아직도, 당신이 묻는 것을 할 수있는 한 가지 가능한 방법을 보여주는 것이 가치가있는 것 같습니다. 마지막 경우, URL이 더 후행 '/'이 없다고

test_url1 = 'https://www.example.com/some/page?user=1&[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] 
# => "" 

주 그래서 결과는 빈 문자열입니다.

정규식 (/^https?:\/\/[^\/]+(.*)/)는, 문자열, 적어도 하나의 비 - 슬래시 ([^\/]+) 다음 :// (:\/\/)이어서 임의로 s (s?),이어서 (^) http (http)로 시작하는 말했다 뒤에 0 개 이상의 문자가오고 그 문자 ((.*))를 캡처하려고합니다.

이 예제와 설명이 교육적이라고 생각하고 실제로이 경우 정규 표현식을 사용하지 않기를 바랍니다. URI 모듈은 사용하기 쉽고 훨씬 강력합니다.

관련 문제