Быстренько накидал тесты очевидных решений:
$h = "subdomain.server.ru." ;
function test1($h)
{
if( !preg_match("|^([a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,6})(\.?)$|", $h, $m) ) {
return 0;
}
if($m[2]) return $m[1];
return $h;
}
function test2($h)
{
if( !preg_match("|^[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,6}\.?$|", $h) ) {
return 0;
}
if(substr($h, -1) == '.') return substr($h, 0, -1);
return $h;
}
Время выполнения 100.000 итераций каждого теста (PHP v5.2.5 Win32):
test1 - 0.53170919418335 sec
test2 - 0.44983506202698 sec
А если пресловутой точки нет в адресе, то второй тест отработает еще быстрее.