Регулярное выражение, которое вам понадобится, может быть немного сложным, потому что имена хостов могут быть бесконечно сложными - у вас может быть несколько поддоменов (например, foo.bar.baz.com) или домен верхнего уровня (TLD). ) может состоять из нескольких частей (например, www.baz.co.uk).
Готовы к сложному регулярному выражению? :)
re = /^(?:(?>[a-z0-9-]*\.)+?|)([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$/i
new_url = o_url.host.gsub(re, '\1').strip
Давайте разберем это на две части. ^(?:(?>[a-z0-9-]*\.)+?|)
будет собирать субдомены, сопоставляя одну или несколько групп символов, за которыми следует точка (жадно, так что все субдомены здесь совпадают). Пустое чередование необходимо в случае отсутствия субдомена (например, foo.com). ([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$
соберет фактическое имя хоста и TLD. Он позволяет использовать TLD, состоящий из одной части (например, .info, .com или .museum), или TLD, состоящий из двух частей, где вторая часть состоит из двух символов (например, .oh.us или .org.uk).
Я проверял это выражение на следующих примерах:
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
Обратите внимание, что это регулярное выражение не будет правильно сопоставлять имена хостов, которые имеют более двух "частей", с TLD!