Чем больше знаю, тем лучше понимаю, как мало знаю.
В имени домена точно не должно быть перевода строки, поэтому только /s.
По поводу /u - сложный вопрос. Лучше было бы сразу конвертировать в Punycode, что-бы оперировать только с английскими доменными именами.
Итого, вытаскиваем TLD: $patternSub = '/(\.[\-\w\d]{2,})$/si';
Здесь аналогично. Но непонятно, $patternDomainName - это когда из доменного имени уже убран TLD, и опять нужно найти TLD (который .ge)? $patternDomainName = '/(\.ge)$/si;
Я разделал на два шаблона, так как имеет значение, где было совпадение, в поддомене или tld. Поиск происходит в цикле, в паттерн подставляется код из списка. Сначала ищу в поддомене, после в tld.