[ruby] URL이 유효한지 확인하는 방법

문자열이 유효한 URL인지 어떻게 확인할 수 있습니까?

예를 들면 :

http://hello.it => yes
http:||bra.ziz, => no

이것이 유효한 URL이라면 이것이 이미지 파일과 관련된 것인지 어떻게 확인할 수 있습니까?



답변

URIRuby와 함께 배포 된 모듈을 사용하십시오 .

require 'uri'

if url =~ URI::regexp
    # Correct URL
end

마찬가지로 알렉산더 귄터는 의견을 밝혔다 문자열이 경우, 그것은 검사 포함 URL을.

문자열 URL 인지 확인하려면 다음을 사용하십시오.

url =~ /\A#{URI::regexp}\z/

웹 URL ( http또는 https) 만 확인하려면 다음을 사용하십시오.

url =~ /\A#{URI::regexp(['http', 'https'])}\z/


답변

위의 답변과 유사하게이 정규식을 사용하면 약간 더 정확하다는 것을 알 수 있습니다.

URI::DEFAULT_PARSER.regexp[:ABS_URI]

URI.regexp어떤 이유로 공백을 허용하는 것과 반대로 공백이있는 URL은 무효화됩니다 .

최근에 다른 URI rgexp에 대해 제공되는 바로 가기를 찾았습니다. 에서 URI::DEFAULT_PARSER.regexp.keys직접 액세스 할 수 있습니다 URI::#{key}.

예를 들어 :ABS_URI정규 표현식은에서 액세스 할 수 있습니다 URI::ABS_URI.


답변

현재 답변의 문제점 은 URI가 URL이 아니라는 것 입니다.

URI는 로케이터, 이름 또는 둘 다로 추가로 분류 될 수 있습니다. “Uniform Resource Locator”(URL)라는 용어는 리소스를 식별하는 것 외에도 기본 액세스 메커니즘 (예 : 네트워크 “위치”)을 설명하여 리소스를 찾는 수단을 제공하는 URI의 하위 집합을 의미합니다.

URL은 URI의 하위 집합이므로 특히 URI에 대한 일치는 원하지 않는 값과 성공적으로 일치한다는 것이 분명합니다. 예를 들어 URN은 다음과 같습니다.

 "urn:isbn:0451450523" =~ URI::regexp
 => 0 

즉, 내가 아는 한 Ruby에는 URL을 구문 분석하는 기본 방법이 없으므로 그렇게하려면 gem이 필요할 것입니다. 특별히 HTTP 또는 HTTPS 형식의 URL을 일치시켜야하는 경우 다음과 같이 할 수 있습니다.

uri = URI.parse(my_possible_url)
if uri.kind_of?(URI::HTTP) or uri.kind_of?(URI::HTTPS)
  # do your stuff
end


답변

나는 Addressable gem을 선호합니다 . URL을보다 지능적으로 처리한다는 것을 알게되었습니다.

require 'addressable/uri'

SCHEMES = %w(http https)

def valid_url?(url)
  parsed = Addressable::URI.parse(url) or return false
  SCHEMES.include?(parsed.scheme)
rescue Addressable::URI::InvalidURIError
  false
end


답변

이것은 상당히 오래된 항목이지만 계속해서 기여할 것이라고 생각했습니다.

String.class_eval do
    def is_valid_url?
        uri = URI.parse self
        uri.kind_of? URI::HTTP
    rescue URI::InvalidURIError
        false
    end
end

이제 다음과 같이 할 수 있습니다.

if "http://www.omg.wtf".is_valid_url?
    p "huzzah!"
end


답변

나를 위해 다음 정규식을 사용합니다.

/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix

선택권:

  • i -대소 문자 구분 안함
  • x -정규식의 공백 무시

이 방법을 설정하여 URL 유효성 검사를 확인할 수 있습니다.

def valid_url?(url)
  url_regexp = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
  url =~ url_regexp ? true : false
end

그것을 사용하려면 :

valid_url?("http://stackoverflow.com/questions/1805761/check-if-url-is-valid-ruby")

잘못된 URL로 테스트 :

  • http://ruby3arabi -결과가 잘못되었습니다.
  • http://http://ruby3arabi.com -결과가 잘못되었습니다.
  • http:// -결과가 잘못되었습니다.

올바른 URL로 테스트 :

  • http://ruby3arabi.com -결과가 유효합니다
  • http://www.ruby3arabi.com -결과가 유효합니다
  • https://www.ruby3arabi.com -결과가 유효합니다
  • https://www.ruby3arabi.com/article/1 -결과가 유효합니다
  • https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en -결과가 유효합니다

답변

이것은 조금 오래되었지만 여기에 내가하는 방법입니다. Ruby의 URI 모듈을 사용하여 URL을 구문 분석하십시오. 파싱 ​​할 수 있으면 유효한 URL입니다. (그러나 그것이 접근 가능하다는 것을 의미하지는 않습니다.)

URI는 다양한 체계를 지원하며 사용자 지정 체계를 직접 추가 할 수 있습니다.

irb> uri = URI.parse "http://hello.it" rescue nil
=> #<URI::HTTP:0x10755c50 URL:http://hello.it>

irb> uri.instance_values
=> {"fragment"=>nil,
 "registry"=>nil,
 "scheme"=>"http",
 "query"=>nil,
 "port"=>80,
 "path"=>"",
 "host"=>"hello.it",
 "password"=>nil,
 "user"=>nil,
 "opaque"=>nil}

irb> uri = URI.parse "http:||bra.ziz" rescue nil
=> nil


irb> uri = URI.parse "ssh://hello.it:5888" rescue nil
=> #<URI::Generic:0x105fe938 URL:ssh://hello.it:5888>
[26] pry(main)> uri.instance_values
=> {"fragment"=>nil,
 "registry"=>nil,
 "scheme"=>"ssh",
 "query"=>nil,
 "port"=>5888,
 "path"=>"",
 "host"=>"hello.it",
 "password"=>nil,
 "user"=>nil,
 "opaque"=>nil}

URI 모듈에 대한 자세한 정보 는 문서 를 참조하십시오 .