Нет необходимости использовать регулярные выражения. Если у вас фиксированный формат, вы можете просто сделать
$input = "3h 20m 31s";
$input = str_replace("h ",":",$input);
$input = str_replace("m ",":",$input);
$input = str_replace("s","",$input);
Или, если вы заинтересованы в регулярных выражениях:
$input = "3h 20m 31s";
$regex = "/^\D*(\d+)\D*(\d+)\D*(\d+)\D*$/";
$matches = array();
preg_match($regex, $input,$matches);
echo implode(":",array_slice($matches,1))