以下のようなメールアドレスのうち「@の前部分」を、文字数分だけ*に置換したいのです。
taro@example.com

これだと4文字決め打ちになってしまいます。
preg_replace('/[a-z0-9\.\-\_]+@/i', '****@', $text);

いまのところシンプルに書ける方法で思いつくのは、
長い文字数から順に置換していく方法です。
forなど使えばシンプルには書けそうです。
preg_replace('/[a-z0-9\.\-\_]{10}@/i', '**********@', $text);
preg_replace('/[a-z0-9\.\-\_]{9}@/i', '*********@', $text);
...

でも美しい方法とは思えません。
定石、または美しい方法はありますか?