Есть 2 варианта:
// Буквы латинского алфавита и цифры:
$regex_name1 = '/^[a-zA-Z0-9]+$/';
// Все, что в первом варианте, дефис (-), точка (.), знак нижнего подчеркивания (_):
$regex_name2 = '/^[a-zA-Z0-9-._]+$/';
Также есть 3 вариант - второй вариант, в котором логин не может начинаться со знака (дефиса, точки или подчеркивания), а также не может использоваться больше 2-х знаков подряд:
$regex_name3 = '/^(?![_.])(?!.*[-_.]{2})[a-zA-Z0-9-._]+(?<![-_.])$/';
Склоняюсь больше к первому варианту, но думаю, что он весьма ограничен. Третий вариант - улучшенный второй, но легко и просто донести его до пользователя (не заставляя его читать, как минимум, 1 строчку текста при регистрации) - это иррационально.
Хочу услышать ваше мнение по этому поводу. Заранее спасибо!