Ваш код проверяет, является ли первый символ недействительным. Чтобы проверить, существуют ли какие-либо недопустимые символы, отмените класс символов вместо функции возврата и удалите якорь:
if ( preg_match("/[^-a-z0-9_]/i", $username) )
{
return true;
}
Вы также можете, конечно, сократить его до /[^-\w]/
(«слово» - это буквы, цифры и подчеркивание), или даже просто /\W/
, если вы не хотите разрешать тире.