La expresión regular que necesitará aquí puede ser un poco complicada, ya que los nombres de host pueden ser infinitamente complejos: puede tener múltiples subdominios (es decir, foo.bar.baz.com) o el dominio de nivel superior (TLD) puede tener varias partes (es decir, www.baz.co.uk).
¿Listo para una expresión regular compleja? :)
re = /^(?:(?>[a-z0-9-]*\.)+?|)([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$/i
new_url = o_url.host.gsub(re, '\1').strip
Vamos a dividir esto en dos secciones. ^(?:(?>[a-z0-9-]*\.)+?|)
recogerá subdominios, haciendo coincidir uno o más grupos de caracteres seguidos de un punto (ávidamente, de forma que todos los subdominios coincidan). La alternancia vacía es necesaria en el caso de que no haya ningún subdominio (como foo.com). ([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$
recogerá el nombre de host real y el TLD. Permite un TLD de una parte (como .info, .com o .museum) o un TLD de dos partes, donde la segunda parte tiene dos caracteres (como .oh.us o .org.uk).
He probado esta expresión en las siguientes muestras:
foo.com => foo.com
www.foo.com => foo.com
bar.foo.com => foo.com
www.foo.ca => foo.ca
www.foo.co.uk => foo.co.uk
a.b.c.d.e.foo.com => foo.com
a.b.c.d.e.foo.co.uk => foo.co.uk
Tenga en cuenta que esta expresión regular no coincidirá correctamente los nombres de host que tienen más de dos "partes" en el dominio de nivel superior!
Olvidé ese sitio, buena respuesta –