Je veux être capable d'analyser n'importe quelle URL avec Ruby pour obtenir la partie principale du domaine sans l'élément www
(juste le example.com
)
Réponses
Trop de publicités?Veuillez noter il n'existe pas de méthode algorithmique permettant de déterminer le niveau le plus élevé auquel un domaine peut être enregistré pour un domaine de premier niveau particulier (les politiques diffèrent selon les registres), la seule méthode consiste à créer une liste de tous les domaines de premier niveau et du niveau auquel les domaines peuvent être enregistrés.
C'est la raison pour laquelle le Liste des suffixes publics existe.
Je suis l'auteur de PublicSuffix une bibliothèque Ruby qui décompose un domaine en ses différentes parties.
Voici un exemple
require 'uri/http'
uri = URI.parse("http://toolbar.google.com")
domain = PublicSuffix.parse(uri.host)
# => "toolbar.google.com"
domain.domain
# => "google.com"
uri = URI.parse("http://www.google.co.uk")
domain = PublicSuffix.parse(uri.host)
# => "www.google.co.uk"
domain.domain
# => "google.co.uk"
Cela devrait fonctionner avec à peu près n'importe quelle URL :
# URL always gets parsed twice
def get_host_without_www(url)
url = "http://#{url}" if URI.parse(url).scheme.nil?
host = URI.parse(url).host.downcase
host.start_with?('www.') ? host[4..-1] : host
end
Ou :
# Only parses twice if url doesn't start with a scheme
def get_host_without_www(url)
uri = URI.parse(url)
uri = URI.parse("http://#{url}") if uri.scheme.nil?
host = uri.host.downcase
host.start_with?('www.') ? host[4..-1] : host
end
Vous devrez peut-être require 'uri'
.
Juste une petite note : pour surmonter le second parsing de l'url du second exemple de Mischa, vous pourriez faire une comparaison de chaîne au lieu de URI.parse.
# Only parses once
def get_host_without_www(url)
url = "http://#{url}" unless url.start_with?('http')
uri = URI.parse(url)
host = uri.host.downcase
host.start_with?('www.') ? host[4..-1] : host
end
L'inconvénient de cette approche est qu'elle limite l'url aux urls basées sur http(s), ce qui est largement la norme. Mais si vous l'utilisez de manière plus générale (par exemple pour les liens ftp), vous devez vous adapter en conséquence.
Adressable est probablement la bonne réponse en 2018, surtout utilise la gemme PublicSuffix pour analyser les domaines .
Cependant, j'ai besoin d'effectuer ce type d'analyse à plusieurs endroits, à partir de diverses sources de données, et j'ai trouvé qu'il était un peu verbeux pour être utilisé à plusieurs reprises. J'ai donc créé une enveloppe autour de lui, Adomain :
require 'adomain'
Adomain["https://toolbar.google.com"]
# => "toolbar.google.com"
Adomain["https://www.google.com"]
# => "google.com"
Adomain["stackoverflow.com"]
# => "stackoverflow.com"
J'espère que cela aidera d'autres personnes.
- Réponses précédentes
- Plus de réponses