Как проверить, действителен ли URL - PullRequest
85 голосов
/ 27 ноября 2009

Как я могу проверить, является ли строка действительным URL?

Например:

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

Если это действительный URL-адрес, как я могу проверить, относится ли он к файлу изображения?

Ответы [ 9 ]

166 голосов
/ 27 ноября 2009

Используйте модуль URI, поставляемый с Ruby:

require 'uri'

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

Как и Александр Гюнтер сказал в комментариях, он проверяет, содержит ли строка URL.

Чтобы проверить, является ли строка URL-адресом , используйте:

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

Если вы хотите проверять только веб-адреса (http или https), используйте это:

url =~ /\A#{URI::regexp(['http', 'https'])}\z/
41 голосов
/ 09 декабря 2010

Подобно ответам выше, я нахожу использование этого регулярного выражения несколько более точным:

URI::DEFAULT_PARSER.regexp[:ABS_URI]

Это сделает недействительными URL-адреса с пробелами, в отличие от URI.regexp, который по некоторым причинам допускает пробелы.

Недавно я нашел ярлык для разных URI rgexps. Вы можете получить доступ к любому из URI::DEFAULT_PARSER.regexp.keys напрямую из URI::#{key}.

Например, к :ABS_URI регулярному выражению можно получить доступ с URI::ABS_URI.

30 голосов
/ 03 мая 2013

Проблема с текущими ответами заключается в том, что URI не является URL-адресом .

URI может быть далее классифицирован как локатор, имя или оба. Термин «унифицированный указатель ресурса» (URL) относится к подмножеству URI что, в дополнение к идентификации ресурса, предоставляют средства найти ресурс, описав его основной механизм доступа (например, его сетевое «местоположение»).

Поскольку URL-адреса являются подмножеством URI, ясно, что сопоставление, в частности, для URI, будет успешно соответствовать нежелательным значениям. Например, URNs :

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

При этом, насколько мне известно, в Ruby нет способа по умолчанию разбирать URL-адреса, поэтому для этого вам, скорее всего, понадобится гем. Если вам нужно сопоставить URL-адреса конкретно в формате HTTP или HTTPS, вы можете сделать что-то вроде этого:

uri = URI.parse(my_possible_url)
if uri.kind_of?(URI::HTTP) or uri.kind_of?(URI::HTTPS)
  # do your stuff
end
19 голосов
/ 14 августа 2012

Я предпочитаю адресуемый гем . Я обнаружил, что он обрабатывает 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
11 голосов
/ 24 октября 2012

Это довольно старая запись, но я решил пойти дальше и внести свой вклад:

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
7 голосов
/ 12 апреля 2017

Для меня я использую это регулярное выражение:

/^(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?("/888557/kak-proverit-deistvitelen-li-url")

Тестирование с неправильными URL-адресами:

  • http://ruby3arabi - недействительный результат
  • http://http://ruby3arabi.com - недействительный результат
  • http:// - недействительный результат

Тест с правильными URL:

4 голосов
/ 06 декабря 2013

В общем

/^#{URI::regexp}$/

будет работать хорошо, но если вы хотите сопоставить только http или https, вы можете передать их в качестве параметров в метод:

/^#{URI::regexp(%w(http https))}$/

Это имеет тенденцию работать немного лучше, если вы хотите отклонить протоколы, такие как ftp://.

3 голосов
/ 29 апреля 2013

Это немного старовато, но вот как я это делаю. Используйте URI-модуль Ruby для анализа 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.

0 голосов
/ 29 ноября 2009

Вы также можете использовать регулярное выражение, возможно, что-то вроде http://www.geekzilla.co.uk/View2D3B0109-C1B2-4B4E-BFFD-E8088CBC85FD.htm при условии, что это регулярное выражение является правильным (я не проверил его полностью), следующее покажет действительность URL.

url_regex = Regexp.new("((https?|ftp|file):((//)|(\\\\))+[\w\d:\#@%/;$()~_?\+-=\\\\.&]*)")

urls = [
    "http://hello.it",
    "http:||bra.ziz"
]

urls.each { |url|
    if url =~ url_regex then
        puts "%s is valid" % url
    else
        puts "%s not valid" % url
    end
}

Приведенный выше пример выводит:

http://hello.it is valid
http:||bra.ziz not valid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...