Получение домена URL с регулярными выражениями - PullRequest
6 голосов
/ 26 июля 2011

Я пытаюсь получить домен по указанному URL.Например, http://www.facebook.com/someuser/ вернет facebook.com.Данный URL может быть в следующих форматах:

  1. https://www.facebook.com/someuser (www. Является необязательным, но его следует игнорировать)
  2. www.facebook.com/someuser (http: // не требуется)
  3. facebook.com/someuser
  4. http://someuser.tumblr.com -> это должно вернуть tumblr.com только

Я написал это регулярное выражение:

/(?: \.|\/{2})(?: www\.)?([^\/]*)/i

Но это не работает, как я ожидаю.

Я могу сделать это по частям:

  1. Удалить http:// и https://, если присутствует настрока с string.delete "/https?:\/\//i".
  2. Удалить www. с string.delete "/www\./i".
  3. Получить домен с совпадением и /(\w+\.\w+)+/i

Но это победило 'работать с поддоменами.Строка для тестирования:

https://www.facebook.com/username
http://last.fm/user/username
www.google.com
facebook.com/username
http://sub.tumblr.com/
sub.tumblr.com

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

Есть идеи?

Ответы [ 6 ]

10 голосов
/ 26 июля 2011

Почему бы вам просто не использовать класс URI для этого?

URI.parse( your_uri ).host

И все готово.

Только одна вещь, если ее нет "http://" или"https://" в начале URL-адреса, вам нужно добавить его, иначе метод синтаксического анализа не даст вам хост (он будет нулевым).

2 голосов
/ 12 октября 2011

Это работает для меня: /^h?t?t?p?s?:?\/?\/?w?w?w?\.?(.*\.[A-Z]{2,})+[A-Z\/]/i Это всегда даст вам только часть домена. Взгляните на это: http://rubular.com/r/0hudnJSgVT

Чтобы использовать его, создайте такой метод, я поместил егопомощники, поэтому у меня есть доступ к в представлениях.

def website_url(website_url)
    if website_url[/^h?t?t?p?s?:?\/?\/?w?w?w?\.?(.*\.[A-Z\/]{2,})$/i]
      website_id = $1
    end

    %Q{http://#{ website_id }}
  end
1 голос
/ 26 июля 2011

Должно ли это быть регулярное выражение? Вы могли бы сделать это также.

require 'uri'
yourURL = URI.parse('https://www.facebook.com/username')
print yourURL.host
0 голосов
/ 12 сентября 2017

Я создал функцию для Строка от класса до Открытые классы техника для Моя цель .

class String
  def to_dn
    return '' if self.blank?
    return self.split('@').last if self.match('@')
    link = self
    link = "http://#{link}" unless link.match(/^(http:\/\/|https:\/\/)/)
    link = URI.parse(URI.encode(link)).host.present? ? URI.parse(URI.encode(link)).host : link.strip
    domain_name = link.sub(/.*?www./,'')
    domain_name = domain_name.match(/[A-Z]+.[A-Z]{2,4}$/i).to_s if domain_name.split('.').length >= 2 && domain_name.match(/[A-Z]+.[A-Z]{2,4}$/i).present?
  end
end

Пример:

 1. "https://www.facebook.com/someuser".to_dn = "facebook.com"
 2. "www.facebook.com/someuser".to_dn = "facebook.com"
 3. "facebook.com/someuser".to_dn = "facebook.com"
 4. "http://someuser.tumblr.com".to_dn = "tumblr.com" 
 5. "dc.ads.linkedin.com".to_dn = "linkedin.com" 
 6. 'your_name@domain.com'.to_dn = "domain.com"

Это также работает для адресов электронной почты (которые требуются для моей цели). Надеюсь, что это будет полезно для других. Поправь меня, если найдешь что-то неправильное:)

Примечание: Это не будет работать для www.domainname.co.in. Я работаю над этим:)

0 голосов
/ 26 июля 2011

Если вы действительно хотите использовать регулярное выражение, вы можете попробовать что-то вроде:

test_string.scan(/\w+\.\w+(?=\/|\s|$)/) { |match| do_stuff_with(match) }

Это не будет учитывать доменные имена, такие как нечто.co.uk, но будет соответствовать всему в вашей тестовой строке.

0 голосов
/ 26 июля 2011

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

/(\w+\.\w{2,6})(?:\/|$)/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...